Странная последовательность при записи в текстовый документ
Привет всем, я здесь впервые, и я новичок в Python. Я сейчас пишу программу, которая возвращает текстовый документ, содержащий информацию об акциях (Watchlist Info.txt), на основе ввода другого текстового документа, содержащего названия компаний (Watchlist).
Для этого я написал 3 функции, из которых 2 функции reuters_ticker()
а также stock_price()
завершены, как показано ниже:
def reuters_ticker(desired_search):
#from company name execute google search for and return reuters stock ticker
try:
from googlesearch import search
except ImportError:
print('No module named google found')
query = desired_search + ' reuters'
for j in search(query, tld="com.sg", num=1, stop=1, pause=2):
result = j
ticker = re.search(r'\w+\.\w+$', result)
return ticker.group()
Цена акции:
def stock_price(company, doc=None):
ticker = reuters_ticker(company)
request = 'https://www.reuters.com/companies/' + ticker
raw_main = pd.read_html(request)
data1 = raw_main[0]
data1.set_index(0, inplace=True)
data1 = data1.transpose()
data2 = raw_main[1]
data2.set_index(0, inplace=True)
data2 = data2.transpose()
stock_info = pd.concat([data1,data2], axis=1)
if doc == None:
print(company + '\n')
print('Previous Close: ' + str(stock_info['Previous Close'][1]))
print('Forward PE: ' + str(stock_info['Forward P/E'][1]))
print('Div Yield(%): ' + str(stock_info['Dividend (Yield %)'][1]))
else:
from datetime import date
with open(doc, 'a') as output:
output.write(date.today().strftime('%d/%m/%y') + '\t' + str(stock_info['Previous Close'][1]) + '\t' + str(stock_info['Forward P/E'][1]) + '\t' + '\t' + str(stock_info['Dividend (Yield %)'][1]) + '\n')
output.close()
3-я функция, watchlist_report()
, вот где у меня возникают проблемы с записью информации в желаемом формате.
def watchlist_report(watchlist):
with open(watchlist, 'r') as companies, open('Watchlist Info.txt', 'a') as output:
searches = companies.read()
x = searches.split('\n')
for i in x:
output.write(i + ':\n')
stock_price(i, doc='Watchlist Info.txt')
output.write('\n')
Когда я бегу watchlist_report('Watchlist.txt')
, где Watchlist.txt содержит "Apple" и "Facebook" каждая в новых строках, мой вывод следующий:
26/04/20 275.03 22.26 1.12
26/04/20 185.13 24.72 --
Apple:
Facebook:
Вместо того, что я хочу и ожидал, основываясь на коде, который я написал в watchlist_report():
Apple:
26/04/20 275.03 22.26 1.12
Facebook:
26/04/20 185.13 24.72 --
Поэтому мои вопросы:
1) Почему мой вывод отформатирован таким образом?
2) Какую часть моего кода мне нужно изменить, чтобы записанный вывод был в желаемом формате?
Также приветствуются любые другие предложения о том, как я могу очистить свой код и любые библиотеки, которые я могу использовать, чтобы сделать свой код лучше!
1 ответ
Вы обрабатываете два разных дескриптора файла - дескриптор файла внутри вашего watchlist_report
закрывается раньше, поэтому он записывается первым, прежде чем дескриптор файла внешних функций будет закрыт, сброшен и записан.
Вместо создания нового open(..)
в вашей функции передайте текущий дескриптор файла:
def watchlist_report(watchlist):
with open(watchlist, 'r') as companies, open('Watchlist Info.txt', 'a') as output:
searches = companies.read()
x = searches.split('\n')
for i in x:
output.write(i + ':\n')
stock_price(i, doc = output) # pass the file handle
output.write('\n')
Внутри def stock_price(company, doc=None):
используйте предоставленный дескриптор файла:
def stock_price(company, output = None): # changed name here
# [snip] - removed unrelated code for this answer for brevity sake
if output is None: # check for None using IS
print( ... ) # print whatever you like here
else:
from datetime import date
output.write( .... ) # write whatever you want it to write
# output.close() # do not close, the outer function does this
Не закрывайте дескриптор файла во внутренней функции, обработка контекста with(..)
внешней функции сделает это за вас.
Главный вывод при работе с файлами заключается в том, что вы write(..)
к вашему файлу не обязательно сразу помещаются туда. Обработчик файлов выбирает, когда на самом деле сохранять данные на вашем диске, самое последнее, что он делает, это когда они выходят за рамки (обработчика контекста) или когда его внутренний буфер достигает некоторого порогового значения, поэтому он "думает", что теперь разумно изменить данные на вашем диске. См. Раздел Как часто Python сбрасывается в файл? для получения дополнительной информации.