我有两个这样的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)
答案 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:])