Python:迭代文件中的行

时间:2015-04-19 07:52:12

标签: python loops

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。

5 个答案:

答案 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。您必须再次打开它,或者确保在读取或迭代到下一行之前按预期处理每条线(在您的示例中拆分和比较)。在您的示例中,由于文件tweetsEOF的第一次迭代后位于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)

您希望为第一个文件的每一行迭代第二个文件。但看看会发生什么:

  • 你打开两个文件
  • 你开始迭代第一个文件
  • 获取第一个文件的第一行
  • 你迭代第二个文件直到结束=>第二个文件的指针是EOF
  • 您尝试处理第一个文件的第二行
  • 第二个文件的指针已经在EOF,你立即循环第一个文件的下一行而不进行任何处理

因此,您必须在第一个文件的每次迭代后倒回第二个文件。你有两种方法可以做到:

  • 将第二个文件作为带有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),则应该优先选择。第二种解决方案使用较少的内存,应该首选的是第二个文件很大......或者如果你因为任何原因需要节省内存(嵌入式系统,脚本影响较小......)