Как «присоединиться» к двум текстовым файлам с помощью python?

У меня есть два 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) 

Используйте 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 zip(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 меньшего файла строки из более длинного файла все равно будут скопированы, а значение fillvalue будет использоваться для строк из более короткого файла.

Вы можете использовать zip для zip этих строк, затем объединить и записать их в свой файл:

 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]) - 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]) 

Здесь есть сценарий для решения этой проблемы: 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:])