在.txt中保存多行文本

时间:2014-06-12 19:03:07

标签: python-2.7

我是一个蟒蛇新手。我可以打印twitter搜索结果,但是当我保存到.txt时,我只得到一个结果。如何将所有结果添加到我的.txt文件中?

t = Twython(app_key=api_key, app_secret=api_secret, oauth_token=acces_token, oauth_token_secret=ak_secret)

tweets                          =   []
MAX_ATTEMPTS                    =   10
COUNT_OF_TWEETS_TO_BE_FETCHED   =   500

for i in range(0,MAX_ATTEMPTS):

    if(COUNT_OF_TWEETS_TO_BE_FETCHED < len(tweets)):
    break

    if(0 == i):
    results = t.search(q="@twitter",count='100')

    else:
    results = t.search(q="@twitter",include_entities='true',max_id=next_max_id)


    for result in results['statuses']:
    tweet_text = result['user']['screen_name'], result['user']['followers_count'],     result['text'], result['created_at'], result['source']
    tweets.append(tweet_text)
    print tweet_text

    text_file = open("Output.txt", "w")
    text_file.write("@%s,%s,%s,%s,%s" % (result['user']['screen_name'], result['user']['followers_count'], result['text'], result['created_at'], result['source']))
    text_file.close()

2 个答案:

答案 0 :(得分:1)

您只需重新排列代码即可在执行循环之前打开文件:

t = Twython(app_key=api_key, app_secret=api_secret, oauth_token=acces_token, oauth_token_secret=ak_secret)

tweets                          =   []
MAX_ATTEMPTS                    =   10
COUNT_OF_TWEETS_TO_BE_FETCHED   =   500

with open("Output.txt", "w") as text_file:
    for i in range(0,MAX_ATTEMPTS):

        if(COUNT_OF_TWEETS_TO_BE_FETCHED < len(tweets)):
        break

        if(0 == i):
        results = t.search(q="@twitter",count='100')

        else:
        results = t.search(q="@twitter",include_entities='true',max_id=next_max_id)


        for result in results['statuses']:
        tweet_text = result['user']['screen_name'], result['user']['followers_count'],     result['text'], result['created_at'], result['source']
        tweets.append(tweet_text)
        print tweet_text

        text_file.write("@%s,%s,%s,%s,%s" % (result['user']['screen_name'], result['user']['followers_count'], result['text'], result['created_at'], result['source']))
        text_file.write('\n') 

我在这里使用Python的语句来打开上下文管理器。当您退出循环时,上下文管理器将处理关闭文件。我还添加了另一个 write 命令,该命令写出一个回车符,以便每行数据都在它自己的行上。

您也可以在附加模式下打开文件(&#39; a&#39;而不是&#39; w&#39;),这样您就可以删除第二个写入命令。

答案 1 :(得分:1)

您的问题有两种常规解决方案。哪个最好可能取决于您的计划的更多细节。

最简单的解决方案是在程序顶部(循环之前)打开文件一次,然后在后面的代码中反复重复使用相同的文件对象。只有在整个循环完成后才能关闭文件。

with open("Output.txt", "w") as text_file:
    for i in range(0,MAX_ATTEMPTS):
        # ...

        for result in results['statuses']:
            # ...

            text_file.write("@%s,%s,%s,%s,%s" % (result['user']['screen_name'],
                                                 result['user']['followers_count'],
                                                 result['text'],
                                                 result['created_at'],
                                                 result['source']))

另一种解决方案是多次打开文件,但是在执行此操作时使用"a"追加模式。追加模式不会像"w"写入模式那样截断文件,并且会自动搜索到结尾,因此您不会覆盖文件的现有内容。如果您要写几个不同的文件,这种方法最合适。如果您只是写一个,我会坚持使用第一个解决方案。

for i in range(0,MAX_ATTEMPTS):
    # ...

    for result in results['statuses']:
        # ...

        with open("Output.txt", "a") as text_file:
            text_file.write("@%s,%s,%s,%s,%s" % (result['user']['screen_name'],
                                                 result['user']['followers_count'],
                                                 result['text'],
                                                 result['created_at'],
                                                 result['source']))

最后一点:看起来你正在写出逗号分隔的数据。您可能希望使用csv模块,而不是手动编写文件。它可以处理诸如引用或转义出现在数据中的任何逗号之类的事情。