我有两个文件,我想将它们的内容并排加入一个文件,即输出文件的第n行应该包含文件1的第n行和文件2的第n行。具有相同的行数。
到目前为止我所拥有的:
with open('test1.txt', 'r') as f1, open('test2.txt', 'r') as f2:
with open('joinfile.txt', 'w') as fout:
fout.write(f1+f2)
但它出错了 -
TypeError: unsupported operand type(s) for +: 'file' and 'file'
我做错了什么?
答案 0 :(得分:2)
我会尝试itertools.chain()
并按行工作(使用“r”打开文件,所以我假设你没有红色二进制文件:
from itertools import chain
with open('test1.txt', 'r') as f1, open('test2.txt', 'r') as f2:
with open('joinfile.txt', 'w') as fout:
for line in chain(f1, f2):
fout.write(line)
它作为生成器工作,因此即使对于大文件也不会出现内存问题。
修改强>
新要求,新样本:
from itertools import izip_longest
separator = " "
with open('test1.txt', 'r') as f1, open('test2.txt', 'r') as f2:
with open('joinfile.txt', 'w') as fout:
for line1, line2 in izip_longest(f1, f2, fillvalue=""):
line1 = line1.rstrip("\n")
fout.write(line1 + separator + line2)
我添加了一个放在行之间的separator
字符串。
izip_longest
也有效。然后fill_value ""
用于缺失的行。 izip_longest
也可用作生成器。
重要的是行line1 = line1.rstrip("\n")
,我猜它的作用很明显。
答案 1 :(得分:1)
你可以用:
fout.write(f1.read())
fout.write(f2.read())
答案 2 :(得分:1)
实际上,您正在连接2个文件对象,但是,您希望连接字符串。
首先使用f.read读取文件内容。例如,这样:
with open('test1.txt', 'r') as f1, open('test2.txt', 'r') as f2:
with open('joinfile.txt', 'w') as fout:
fout.write(f1.read()+f2.read())
答案 3 :(得分:1)
我更喜欢使用shutil.copyfileobj。您可以轻松地将它与glob.glob结合起来,通过模式连接一堆文件
>>> import shutil
>>> infiles = ["test1.txt", "test2.txt"]
>>> with open("test.out","wb") as fout:
for fname in infiles:
with open(fname, "rb") as fin:
shutil.copyfileobj(fin, fout)
与glob.glob结合
>>> import glob
>>> with open("test.out","wb") as fout:
for fname in glob.glob("test*.txt"):
with open(fname, "rb") as fin:
shutil.copyfileobj(fin, fout)
但除此之外,如果你所在的系统中你可以使用posix实用程序,那么更喜欢使用
D:\temp>cat test1.txt test2.txt > test.out
如果您使用的是Windows,可以从命令提示符处发出以下命令。
D:\temp>copy/Y test1.txt+test2.txt test.out
test1.txt
test2.txt
1 file(s) copied.
注意强> 根据您的最新更新
是的,它有相同的行数,我想加入每一行 一个文件与另一个文件
with open("test.out","wb") as fout:
fout.writelines('\n'.join(''.join(map(str.strip, e))
for e in zip(*(open(fname) for fname in infiles))))
在posix系统上,你可以做到
paste test1.txt test2.txt