逃避if语句

时间:2014-04-03 12:49:23

标签: python python-2.7

我有两个文件:

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语句引起的,但我怎么能逃避这一点。

3 个答案:

答案 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。