-1

2 つのファイルがあり、それらの内容を 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_longest1 つのファイルに他の行よりも多くの行がある場合にも機能します。次に、欠落している行に fi​​ll_value""が使用されます。izip_longestジェネレーターとしても機能します。

行も重要ですline1 = line1.rstrip("\n")。それが何をするかは明らかだと思います。

于 2013-01-11T08:44:14.433 に答える
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.

最新の更新に基づく

はい、同じ行数で、1つのファイルのすべての行を他のファイルと結合したいと思います

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 に答える
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 に答える