我想从特定用户下载新推文,并使用其他一些规则进行过滤。如何交叉引用我正在处理的推文中的推文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()
答案 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,请使用此方法。
构建您的代码,以便您只打开一次文件,对它们进行操作并最终关闭它们。