如何加入"两个带python的文本文件?

时间:2015-01-17 07:48:08

标签: python file python-2.7

我有两个这样的txt文件: TXT1:

Foo
Foo
Foo
Foo

TXT2:

Bar
Bar
Bar
Bar

如何通过左侧和右侧将它们连接到一个新文件中,让我们这样说:

Bar Foo
Bar Foo
Bar Foo
Bar Foo

我尝试了以下内容:

folder = ['/Users/user/Desktop/merge1.txt', '/Users/user/Desktop/merge2.txt']
with open('/Users/user/Desktop/merged.txt', 'w') as outfile:
    for file in folder:
        with open(file) as newfile:
            for line in newfile:
                outfile.write(line)

3 个答案:

答案 0 :(得分:7)

使用itertools.izip组合两个文件中的行,例如

from itertools import izip
with open('res.txt', 'w') as res, open('in1.txt') as f1, open('in2.txt') as f2:
    for line1, line2 in izip(f1, f2):
        res.write("{} {}\n".format(line1.rstrip(), line2.rstrip()))

注意:此解决方案只会从两个文件中写入行,直到其中一个文件耗尽。例如,如果第二个文件包含1000行而第一个文件只有2行,则每个文件只有两行被复制到结果中。如果您想要在最短文件耗尽后从最长文件中获取行,您可以使用itertools.izip_longest,就像这样

from itertools import izip_longest
with open('res.txt', 'w') as res, open('in1.txt') as f1, open('in2.txt') as f2:
    for line1, line2 in izip_longest(f1, f2, fillvalue=""):
        res.write("{} {}\n".format(line1.rstrip(), line2.rstrip()))

在这种情况下,即使较小的文件耗尽,较长文件中的行仍将被复制,fillvalue将用于较短文件中的行。

答案 1 :(得分:2)

您可以使用zip压缩这些行然后连接并将它们写在您的outfile中:

folder = ['/Users/user/Desktop/merge1.txt', '/Users/user/Desktop/merge2.txt']
with open('/Users/user/Desktop/merged.txt', 'w') as outfile:
    for file in folder:
        with open(file[0]) as newfile,open(file[1]) as newfile1:
            lines=zip(newfile,newfile1)
            for line in lines:
                outfile.write(line[0].rstrip() + " " + line[1])

答案 2 :(得分:1)

这里有一个解决此问题的脚本: https://gist.github.com/fabriciorsf/92c5fb1a7d9f001f777813a79e681d8b

#!/usr/bin/env python

'''
Merge/Join/Combine lines of multiple input files.
Write lines consisting of the sequentially corresponding lines from each input file, separated by whitespace character, to output file.
TODO: implements params like https://github.com/coreutils/coreutils/blob/master/src/paste.c
'''

import sys
from contextlib import ExitStack
from itertools import zip_longest


def main(args):
  if len(args) < 3:
    print(sys.argv[0] + ' <input-file-1> <input-file-2> [<input-file-n>...] <output-file>')
    sys.exit(0)
  mergeFiles(args[:len(args)-1], args[len(args)-1])


def mergeFiles(inputFileNames, outputFileName, delimiterChar=" ", fillValue="-"):
  with ExitStack() as eStack:
    inputFiles = [eStack.enter_context(open(fileName, 'r', encoding='utf-8', errors='replace')) for fileName in inputFileNames]    
    with open(outputFileName, 'w', encoding='utf-8', errors='replace') as outputFile:    
      for tupleOfLineFiles in zip_longest(*inputFiles, fillvalue=fillValue):
        outputFile.write(delimiterChar.join(map(str.strip, tupleOfLineFiles)) + "\n")

if __name__ == "__main__":
  main(sys.argv[1:])