-1

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

4 回答 4

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也可用作发电机。

重要的是 line line1 = line1.rstrip("\n"),我想它的作用很明显。

于 2013-01-11T08:44:14.433 回答
1

You can do it with:

fout.write(f1.read())
fout.write(f2.read())
于 2013-01-11T08:39:49.420 回答
1

You are actualy concatenating 2 file objects, however, you want to conctenate strings.

Read the file contents first with f.read. For example, this way:

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())
于 2013-01-11T08:39:55.773 回答
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
于 2013-01-11T08:52:24.020 回答