queries = open(sys.argv[1],"rU")
tweets = open(sys.argv[2],"rU")
for query in queries:
for tweet in tweets:
query_words = query.split()
tweet_words = tweet.split()
for qword in query_words:
for tword in tweet_words:
#Comparison
我正在尝试使用python迭代两个文件,每个文件中有多行。我想要做的是,将两个文件中的每一行分解为单词,然后将“查询”文件中当前行中的每个单词与“tweet”文件中当前行中的每个单词进行比较。以上是我到目前为止所做的,但它只适用于查询文件中的第一行,并跳过其中的其余行。它适用于推文文件中的每一行。有什么帮助吗?
编辑duplicate_comment:我理解在迭代查询文件后,文件句柄将定位在EOF。但我不明白为什么它不处理查询文件中的下一行,而只是直接进入EOF。
答案 0 :(得分:2)
基本上发生的事情是,您只需查看另一个文件中的第一行,就可以浏览一个文件中的所有行。你不能在下一次迭代中浏览这些行,因为你已经读过它们了。
这样做:
queries = open(sys.argv[1],"rU").readlines()
tweets = open(sys.argv[2],"rU").readlines()
for i in range(min(len(queries), len(tweets))):
tweet = tweets[i]
query = queries[i]
# comparison
答案 1 :(得分:1)
问题在于,在遍历文件的每一行后,您处于EOF
。您必须再次打开它,或者确保在读取或迭代到下一行之前按预期处理每条线(在您的示例中拆分和比较)。在您的示例中,由于文件tweets
在EOF
的第一次迭代后位于query
,因此文件queries
似乎“跳过”到EOF
开始第二次迭代,只是因为在嵌套循环中不再有tweet
迭代。
此外,尽管垃圾收集会为您处理文件关闭,但显式关闭每个打开的文件仍然是一种更好的做法。
请参阅@Smac89's answer进行修改。
答案 2 :(得分:1)
使用函数file.readline()
而不是像这样的循环queries = open(sys.argv[1],"rU")
tweets = open(sys.argv[2],"rU")
query = queries.readline()
tweet = tweets.readline()
while (query != "" and tweet != ""):
query_words = query.split()
tweet_words = tweet.split()
#comparison
query = queries.readline()
tweet = tweets.readline()
mirosval提供了一个更简单的答案,使用他的
答案 3 :(得分:1)
考虑使用file.seek:
with open(sys.argv[1],"rU") as queries:
with open(sys.argv[2],"rU") as tweets:
for query in queries:
query_words = query.split()
for tweet in tweets:
tweet_words = tweet.split()
for qword in query_words:
for tword in tweet_words:
#Comparison
tweets.seek(0) # go back to the start of the file
答案 4 :(得分:0)
您希望为第一个文件的每一行迭代第二个文件。但看看会发生什么:
因此,您必须在第一个文件的每次迭代后倒回第二个文件。你有两种方法可以做到:
将第二个文件作为带有readlines
的行列表加载到内存中,并遍历此列表。因为它是一个列表(而不是文件),迭代将从第一个位置而不是当前位置开始
queries = open(sys.argv[1],"rU")
tweets_file = open(sys.argv[2],"rU")
tweets = tweets_file.readlines() # tweets is now a list of lines
for query in queries:
for tweet in tweets:
query_words = query.split()
tweet_words = tweet.split()
for qword in query_words:
for tword in tweet_words:
#Comparison
使用skip
queries = open(sys.argv[1],"rU")
tweets = open(sys.argv[2],"rU")
for query in queries:
for tweet in tweets:
query_words = query.split()
tweet_words = tweet.split()
for qword in query_words:
for tword in tweet_words:
#Comparison
tweets.seek(0) # explicitely rewind tweets
第一个解决方案只读取第二个文件一次但使用更多内存。如果第二个文件 small (在最近的机器上少于几百个Mo),则应该优先选择。第二种解决方案使用较少的内存,应该首选的是第二个文件很大......或者如果你因为任何原因需要节省内存(嵌入式系统,脚本影响较小......)