【发布时间】:2013-02-06 20:17:22
【问题描述】:
我是一个 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')
尴尬,我打开同一个文件两次。菜鸟。
【问题讨论】:
-
几个cmets:
name已经是一个字符串,所以不需要str(name)。同样,"1"比str(1)更好。然后,\n是 Python 中的换行符;它会在 Windows 上自动将其转换为\r\n,因此无需这样做(这样做甚至可能会受到伤害)。 -
@TimPietzcker:+1。除非您在 Unix 上阅读 Windows 文本文件,否则它可能会很有用。 (但是 OP 看起来他正在使用 Py3,所以有更好的方法来做到这一点。)
-
另外,你可能指的是
f2 = open(file2),而不是f2 = open(file1),对吧?否则,f1 中的每一行也在 f2 中,因为它们是同一个文件……并且您应该考虑使用with open(file1) as f1, open(file) as f2:而不是显式的close语句,因为它更容易阅读且更难出错。