【问题标题】:If statement inside nested 'for' loops is evaluating only once - python如果嵌套'for'循环中的语句只评估一次 - python
【发布时间】:2012-03-22 19:30:15
【问题描述】:

我正在编写一个代码,它将文件 1(单列条目​​)与文件 2(3 列条目)进行比较,并根据第一列从文件 2 中获取匹配的记录。问题是它只评估循环一次。

文件1:

ABC

DEF

JKL

文件2:

IJK,123,SDF

ABC,456,HJK

QWE,876,GFT

JKL,098,HGF

.....

我的代码:

for entry in fh_file1:
    mir = entry.strip('\n')
    print(mir)
    for row in fh_file2:
        row_splt = row.split(',')             
        print(row_splt[0])
        if mir in row_splt[0]:
            print (row.strip('\n'))
        else:
            pass

该代码的结果:

只是文件1的第一个条目的匹配:

ABC 456 HJK

请帮帮我。

【问题讨论】:

  • 为什么if mir in row_splt[0]: 不是if mir == row_splt[0]:
  • 这类问题经常被问到,但我很难找到一个好的副本。
  • @tauran 这甚至不一样。一个检查完全相等,另一个是子字符串/元素(取决于类型,没有仔细查看代码)搜索。
  • @delnan:我知道。但我不明白他为什么在这里使用in
  • 我在您的数据中看不到任何逗号。为什么你的string.split() 设置为逗号分隔?

标签: python if-statement for-loop nested-loops


【解决方案1】:

文件是数据流。当你遍历它们时,你一次读一行。在内部循环结束时,该文件已到达末尾。对于外循环的下一次迭代,它不会从头开始重新开始,因为文件不是这样工作的。

您通常应该先将文件读入内存:list(fh_file1) 会给您一个 list 行数,您可以随意循环多次。

【讨论】:

  • fh_file2 是问题所在,而不是fh_file1,而且file.readlines() 通常比list(file) 更高效、更清晰。此外,您可以重新缠绕或重新打开文件,而不是将所有内容读入内存。
【解决方案2】:

您需要在第二个 for 循环之前添加 fh_file2.seek(0) 以从文件开头重新开始。

不过,最好将它读入内存一次:

file2_lines = fh.file2.readlines()

然后迭代file2_lines。从磁盘读取另一个文件中的每一行的文件会很慢。

【讨论】:

  • 谢谢。 “寻找”建议完美地完成了这项工作。我试图在网上找到解决方案,但在任何地方都找不到。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 2019-04-22
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
相关资源
最近更新 更多