如何仅从一个嵌套循环中断

2024-04-30 06:21:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个制表符分隔的文件,我需要用另一个文件中的所有行来测试第一个文件中的每一行。例如

文件1:

row1    c1    36    345   A
row2    c3    36    9949  B
row3    c4    36    858   C

文件2:

row1    c1    3455  3800
row2    c3    6784  7843
row3    c3    10564 99302
row4    c5    1405  1563

假设我想输出(file1)中的所有行,其中file1的col[3]小于file2的任何(不是所有)col[2],假设col[1]相同。

预期产量:

row1    c1    36    345   A
row2    c3    36    9949  B

因为我在Ubuntu工作,所以我希望input命令如下:
python code.py [file1] [file2] > [output]

我写了以下代码:

import sys

filename1 = sys.argv[1]
filename2 = sys.argv[2]

file1 = open(filename1, 'r')
file2 = open(filename2, 'r')

done = False

for x in file1.readlines():
    col = x.strip().split()
    for y in file2.readlines():
        col2 = y.strip().split()
        if col[1] == col2[1] and col[3] < col2[2]:
            done = True
            break
        else: continue
print x

但是,输出如下:

row2    c3    36    9949  B

这对于较大的数据集是显而易见的,但基本上我总是只得到嵌套循环中条件为真的最后一行。我怀疑“分手”会把我从两个圈子里都打垮。我想知道(1)如何脱离for循环中的一个,以及(2)这是否是我在这里遇到的唯一问题。


Tags: 文件forsyscolfile1file2col2row1
2条回答

您需要将数字字符串解析为它们对应的整数值。

您可以按如下方式使用int('hoge')

import sys

filename1 = sys.argv[1]
filename2 = sys.argv[2]

with open(filename1) as file1:
    for x in file1:
        with open(filename2) as file2:
            col = x.strip().split()
            for y in file2:
                col2 = y.strip().split()
                if col[1] == col2[1] and int(col[3]) < int(col2[2]):
                    print x

breakcontinue应用于最里面的循环。

问题是您只打开第二个文件一次,因此它只读取一次。当您第二次执行for y in file2.readlines():时,file2.readlines()返回一个空的iterable。

file2 = open(filename2, 'r')移到外部循环中,或使用seek()返回到file2的开头。

相关问题 更多 >