Python - 组合来自2个文件的元素

时间:2018-04-26 00:04:10

标签: python file merge

任何人都可以帮我这个: 我有两个文件,比如说:

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我看到的错误是您尝试将列表s与两个字符串连接起来,并且不允许这样做。正确的方法是将附加元素ss[1]附加到列表s,然后打印结果。或者只使用line1作为字符串。

您还需要在s[0] != ss[0]处理案例,在这种情况下,您只想打印line1

关于readlines的一个重要注意事项是,每次调用文件时,它都不会自动将文件指针重置为文件的开头。相反,一旦文件指针到达结尾,它就会停留在那里。

几乎没有其他选择。

  1. 在搜索循环之前添加file2.seek(0)语句

  2. 将文件内容加载到列表中,并迭代这些内容,如:

    file1_content = open('file1.ext', 'r').readlines()

    for line1 in file1_content: ...

  3. open循环中嵌入for文件语句,如:

    for line2 in open('file2.ext', 'r')

    请注意,文件是可迭代的,因此您不需要readlines()

  4. 当然,最佳解决方案取决于几个因素。我会在这里选择#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