1

我是一个 python 菜鸟,我正在尝试比较两个文件中的行之间的值,如果该行在第二个文件中,则输出“行名”,后跟 1,如果第二个文件中缺少该行,则输出 0。第一次迭代返回 1,因为该行在第二个文件中,但对于剩余 > 1,000 行,无论它们是否在第二个列表中,它们都返回 0。似乎第二个“for循环”只在第一次迭代时执行。关于为什么的任何想法?这是我的代码:

    import sys  

    file1 = sys.argv[1] 

    file2 = sys.argv[2]

    name = str(file2)

    f1 = open(file1, 'r') 
    f2 = open(file1, 'r')
    o1 = open((name + '1.txt'), 'w')

    for line in f1:
        name = line.strip('\r\n')
        count = 0
        for line1 in f2:
            if name == line1.strip('\r\n'):
                count += 1
                print (str(name) + '\t' + str(1))
                o1.write(str(name) + '\t' + str(1) + '\r\n')
        if count == 0:
            print (str(name) + '\t' + str(0))
            o1.write(str(name) + '\t' + str(0) + '\r\n')

    f1.close()
    f2.close()
    o1.close()
Any help is very much appreciated!

经过一些更改,这就是我所拥有的,它只返回“1s”

f1 = open(file1, 'r') #opens files for reading
f2 = open(file2, 'r')
o1 = open((name + '1.txt'), 'w')

f2s = {line.strip('\n') for line in f2}

for line in f1:
    line = line.strip('\n')
    count = 0
    if line in f2s:
        count += 1
        print (str(line) + '\t' + str(1))
        o1.write(str(line) + '\t' + str(1) + '\n')
    if count == 0:
        print (str(line) + '\t' + str(0))
        o1.write(str(line) + '\t' + str(0) + '\n')

尴尬的是,我打开同一个文件两次。菜鸟。

4

3 回答 3

3

f2是第二个文件的迭代器,当它被读取时,它已经用尽了。

可以 重置迭代器f2.seek(0, 0),但这并不是最好的方法。

最好将所有值 fromf2放入 a 中set,然后只迭代f1一次:

f2s = {line.strip('\n') for line in f2}

for line in f1:
    name = line.strip('\n') # No need for \r\n
    if name in f2s:
        # etc.

f1如果您需要从in计算每行的出现次数f2,则可以使用 a Counter

from collections import Counter
f2c = Counter(line.strip('\n') for line in f2)

for line in f1:
    name = line.strip('\n')
    if name in f2c:
        count = f2c[name]
于 2013-02-06T20:22:53.457 回答
1

第一次执行for line in f2:时,它会遍历 中的每一行f2,将当前文件指针留在文件末尾。所以,第二次,它从文件末尾开始,遍历所有剩余的 0 行……</p>

如果你想重复这一点,有几种方法可以做到。您可以将其f2 = open(file1, 'r')移至外循环。或者您可以使用 重置文件f2.seek(0, 0)。或者你可以使用itertools.tee.

但是,除非您真的没有足够的内存一次保存整个文件,否则您可能希望list第一次将这些行读入 a 并对其进行迭代list

l2 = list(f2)
# ...
for line in f1:
    # ...
    for line1 in l2:
        # ...
于 2013-02-06T20:23:04.637 回答
0

标准库difflib有助于比较行,也许您可​​以利用它。

于 2013-02-06T20:51:48.280 回答