检查txt文件中是否包含ID

时间:2016-04-17 23:09:56

标签: python python-3.x

我想从特定用户下载新推文,并使用其他一些规则进行过滤。如何交叉引用我正在处理的推文中的推文ID以及tweetid.txt文件中的ID,以避免重复我在NRE_tweet文件中保存的内容?

这是我到目前为止所写的产生重复的内容。

i = 0
for tweet in NRE_tweets:

    tweet_ids = open('tweetid.txt', 'a+')

    if NRE_tweets[i]['in_reply_to_screen_name'] is None:

        if NRE_tweets[i]['id_str'] not in tweet_ids.readlines():
            print("adding tweet " + str(NRE_tweets[i]['id_str']))
            info_wanted.append(NRE_tweets[i]['text'])
            info_wanted.append(NRE_tweets[i]['id_str'])
            info_wanted.append(NRE_tweets[i]['created_at'])

            NRE_file = open('NRE.txt', 'a')
            NRE_file.write(str(info_wanted) + '\n')
            NRE_file.close()

            append_tweet_ids = open('tweetid.txt', 'a')
            append_tweet_ids.write(NRE_tweets[i]['id_str'] + '\n')
            append_tweet_ids.close()

    tweet_ids.close()
    info_wanted = []

    i += 1

编辑:感谢您的建议,现在对工作代码进行了排序。我可以采取一些措施使其更清洁,但现在......它有效。

NRE_tweets = t.statuses.user_timeline(screen_name='NRE_northern')
i = 0

NRE_file = open('NRE.txt', 'a')
openFile = shelve.open('tweetid')

try:
    loadIDs = openFile['list_id']
    print("list_id's loaded")
except:
    print("exception entered")
    loadIDs = []

for tweet in NRE_tweets:
    if NRE_tweets[i]['in_reply_to_screen_name'] is None: # check that tweet isn't a reply
        if NRE_tweets[i]['id_str'] in loadIDs:
            print(str(NRE_tweets[i]['id_str']) + ' already stored')

        else:
            print("adding " + str(NRE_tweets[i]['id_str']))
            # added wanted elements to a list
            info_wanted.append(NRE_tweets[i]['text'])
            info_wanted.append(NRE_tweets[i]['id_str'])
            info_wanted.append(NRE_tweets[i]['created_at'])

            # added list to txt file
            NRE_file.write(str(info_wanted) + '\n')

            loadIDs.append(NRE_tweets[i]['id_str'])
            openFile['list_id'] = loadIDs

    info_wanted = []

    i += 1

print(openFile['list_id'])  
NRE_file.close()
openFile.close()

1 个答案:

答案 0 :(得分:3)

请勿在代码中使用if x is None:,除非x确实是None。因为只有None is None和其他所有人(0,空迭代等)都是骗子:)相反,你应该使用if not x

readlines()返回文件中的行,包括每行的结尾\n行。所以你应该写if (NRE_tweets[i]['id_str'] + '\n') not in tweet_ids.readlines():

就像你在评论中被告知的那样,在之前打开文件你的for循环,然后在 for循环之后关闭。另外,请考虑使用shelve模块(或sqlite3);它将使处理数据变得更加容易。

编辑:

另外我注意到你打开tweetid.txt两次而没有在两者之间关闭。不需要IF块内的第二个open()。您只需使用第一个文件句柄调用write(),即可将新ID添加到文件中。您还应该在循环外调用readlines()并将其保存到一个列表中,然后在for循环标头中使用该列表,因为对于新的代码结构,后续调用readlines()将返回一个空字符串as该文件已用尽。因此,当您找到新ID时,请将其附加到此列表,并致电write()以将ID添加到tweetid.txt

另一种方法是首先以读取模式打开文件,调用readlines()并将结果保存到列表中,然后关闭文件。启动循环并在列表上执行所有操作;添加新ID,删除等等。在循环结束时,您在写入模式下重新打开tweetid.txt并将列表内容写入文件;它会覆盖旧内容。如果您可以添加大量新ID​​,请使用此方法。

构建您的代码,以便您只打开一次文件,对它们进行操作并最终关闭它们。