我有两个文件:
file1 = "line1\n line2\n line3\n"
file2 = "line1\n line2\n line3\n line4\n line5\n"
我想要的是:
打印file2中的所有行,仅替换文件1中具有公共长度的行。
我试过了。
for line in file1.splitlines():
for l in file2.splitlines():
if len(line) == len(l):
print file2.replace(l, line)
问题是结果只包含具有公共长度的行,而不包含file2中的所有行。我知道这是由if语句引起的,但我怎么能逃避这一点。
答案 0 :(得分:0)
也许是这样的?我不太明白你的问题,对不起:
for line in file1.splitlines():
for i,l in enumerate(file2.splitlines()):
if len(line) == len(l):
file2[i] = file2.replace(l, line)
print file2
答案 1 :(得分:0)
您的问题可能与您指定的完全不同。你可以这样做:
def file_compare(file1, file2):
for file1line, file2line in zip(file1.splitlines(), file2.splitlines()):
yield file1line if len(file1line) == len(file2line) else file2line
file3.writelines(file_compare(file1, file2))
每行一起遍历文件。对于每一行,它根据约束返回一个或另一个(在这种情况下,如果长度相等,则从file1返回行,否则从文件2返回行)。 writelines可以将此生成器作为输入将行写入另一个文件。
答案 2 :(得分:0)
假设file1更短:
lines1 = file1.splitlines()
lines2 = file2.splitlines()
for num, line in enumerate(lines1):
line2 = lines2[num]
print line if len(line2) == len(line) else line2
for line in lines2[num+1:]:
print line
使用实际文件会更容易,因为你可以滥用next()来迭代行:
file1 = open("file1.txt")
file2 = open("file2.txt")
for line in file1:
line2 = next(file2)
print line if len(line2) == len(line) else line2
for line in file2:
print line
好吧,你可以使用itertools.zip_longest,但这是作弊:
from itertools import izip_longest
file1 = "line1\n line2\n line3\n"
file2 = "line1\n line2\n line3\n line4\n line5\n"
for line1, line2 in izip_longest(file1.splitlines(), file2.splitlines(), fillvalue=''):
print line1 if len(line2) == len(line1) else line2
编辑:在py2中,zip_longest称为izip_longest。