任何人都可以帮我这个: 我有两个文件,比如说:
File1中:
A1 B1 C1 D1
A2 B2 C2 D2
A3 B3 C3 D3
A4 B4 C4 D4
文件2:
A1 E1
A4 E4
所需的输出:
A1 B1 C1 D1 E1
A2 B2 C2 D2
A3 B3 C3 D3
A4 B4 C4 D4 E4
这就是我得到的,它不会工作:
>>> for line1 in file1.readlines ():
>>> s = line1.split ()
>>> # do stuff...
>>> for line2 in file2.readlines ():
>>> ss = line2.split ()
>>> if s [0] == ss[0]:
>>> outfile.write (s + " " + ss [1])
>>> # do some more stuff
有什么想法吗?
答案 0 :(得分:0)
我看到的错误是您尝试将列表s
与两个字符串连接起来,并且不允许这样做。正确的方法是将附加元素ss[1]
附加到列表s
,然后打印结果。或者只使用line1作为字符串。
您还需要在s[0] != ss[0]
处理案例,在这种情况下,您只想打印line1
。
关于readlines
的一个重要注意事项是,每次调用文件时,它都不会自动将文件指针重置为文件的开头。相反,一旦文件指针到达结尾,它就会停留在那里。
几乎没有其他选择。
在搜索循环之前添加file2.seek(0)
语句
将文件内容加载到列表中,并迭代这些内容,如:
file1_content = open('file1.ext', 'r').readlines()
for line1 in file1_content: ...
在open
循环中嵌入for
文件语句,如:
for line2 in open('file2.ext', 'r')
请注意,文件是可迭代的,因此您不需要readlines()
。
当然,最佳解决方案取决于几个因素。我会在这里选择#3,因为我觉得它更像pythonic:
outfile = open('outfile.ext', 'w')
for line1 in open('file1.ext', 'r'):
s = line1.split ()
# reset search flag
found = False
# start search loop
for line2 in open('file2.ext', 'r'):
ss = line2.split ()
# search for a match
if s [0] == ss[0]:
# match found: set the flag
found = True
# write to file with additional element appended (*)
outfile.write (line1.strip() + ' ' + ss[1] + '\n'))
# No match found: just save the original line
if not found:
outfile.write(line1)
(*)应该有一个换行符,我们会在追加最后一个元素之前将其删除。当您写入文件时,我们必须将其添加回来。
另请参阅此处:https://eval.in/994943或此处的变体https://eval.in/994944