【问题标题】:Python reading lines in nested for loops from two filesPython从两个文件的嵌套for循环中读取行
【发布时间】:2012-10-30 11:24:08
【问题描述】:

我想将一个文本文件的行与另一个文本文件逐行匹配,我的嵌套for循环有问题,一定很简单,但我找不到,

for line1 in ratings:
    cont1+=1

    for line2 in movies:
         cont2+=1
         print(cont1,cont2)

我用这个循环简化了它,以检查错误, 外循环没有达到 cont=2,

1 1
1 2
1 3
1 4
1 5
1 6
1 7
.
.
.
1 157
>>>

【问题讨论】:

  • 您的描述和程序似乎不一致,这将为来自ratings 的每一行生成来自movies 的每一行 - 我认为你想要的是zip()itertools.zip_longest() 匹配第 1 行与第 1 行,第 2 行与第 2 行,等等......
  • 我解释的不是很好,对不起。我的主要问题是我不明白为什么这个嵌套循环可以自己正常工作,并且迭代两个字符串也可以正常工作,为什么这对文件不起作用,并且在索引 1 中卡住了外循环?
  • 我想你的文件只有一行。请给出你所有的代码和文件内容,否则我们不能多说。
  • 问题是我需要用 seek(0) 重置内部循环,这样循环才能正常工作,感谢大家的回复。
  • 这能回答你的问题吗? Script skips second for loop when reading a file

标签: python file loops line


【解决方案1】:

你需要同时遍历两个文件

ratings= open('ratings.txt')
movies= open('movies.txt')

for rating, movie in itertools.izip(ratings, movies):
    # do task

ratings= open('ratings.txt').readlines()
movies= open('movies.txt').readlines()

for rating, movie in zip(ratings, movies):
    # do task

【讨论】:

  • 为什么是itertools.zip?这是哪个版本的python?
  • 为什么使用readlines()而不是遍历文件?它使使用izip() 毫无意义。这也假设文件的长度相同,或者您不介意被截断。
【解决方案2】:

问题是我需要用 seek(0) 重置内部循环,这样循环才能正常工作,感谢大家的回复。

【讨论】:

    【解决方案3】:

    您的实现为 file1 中的每一行运行 run all line in file2,

    实际的代码应该是,

    for line1,line2 in zip(ratings,movies):
     cont1+=1
     cont2+=1
     print(cont1,cont2)
    

    【讨论】:

    • 假设文件长度相同,或者您不介意截断文件。
    【解决方案4】:
    with open('ratings.txt') as ratings, open('movies.txt') as movies:
        for rating, movie in itertools.izip(ratings, movies):
            # do task
    

    这是对avasal's answer 的改进,因为它迭代地获取行(相当于现在已弃用的旧xreadlines),而不是通过readlines() 读取所有行。所以它应该从每个文件中读取一行,然后处理它们,然后再读取另一行等,允许在 readlines 实现仅限于较小文件的文件中。

    请注意,izip 会一直持续到其中一个迭代器停止,因此您只会获得与较短文件一样多的行。但是,我假设这是正确的,因为代码隐含地假设这两个文件仍然匹配。

    【讨论】:

    • 你为什么要发g_read()?它实际上什么也没做。您还应该使用with 语句打开文件。
    • @Lattyware:你说得有道理,我忘记了 open 的结果是可迭代的。我还认为with 只能采用 1 个上下文,但显然在 2.7.3 中它可以采用上述多个上下文。所以,干杯。
    猜你喜欢
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多