将文件内容加入一个文件

时间:2013-01-11 08:34:49

标签: python

我有两个文件,我想将它们的内容并排加入一个文件,即输出文件的第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'

我做错了什么?

4 个答案:

答案 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