写入txt文档时出现奇怪的顺序

Weird sequence when writing into txt document

大家好,我是第一次来这里,我是Python的初学者。我正在编写一个程序,该程序 returns 一个包含股票信息的 txt 文档(观察列表 Info.txt),基于另一个包含公司名称(观察列表)的 txt 文档的输入。

为了实现这个,我写了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()

第三个函数 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) 我必须更改代码的哪一部分才能以我想要的格式生成书面输出?

关于如何清理我的代码的任何其他建议以及我可以用来使我的代码更好的任何库也非常感谢!

您处理两个不同的文件句柄 - 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(..) 到文件的内容不一定会立即放在那里。文件处理程序选择何时实际将数据持久化到您的磁盘,它所做的最新操作是当它超出(上下文处理程序的)范围或当其内部缓冲区达到某个阈值时,因此 "thinks" 现在谨慎的是更改为光盘上的数据。有关详细信息,请参阅 How often does python flush to a file?