新しいファイルを作成せずに複数のファイルを1つのファイルオブジェクトに連結する [Python]

このエントリーをはてなブックマークに追加

質問:

この質問はPythonでテキスト・ファイルを連結するに関連してるかも。

今、[‘file1.txt’, ‘file2.txt’,…]のようなfile_namesのリストがある。

僕は全部のファイルを行ごとに読んで、単一のファイルオブジェクトにしたいんだけど、でもその過程で新しいファイルを作らずにやることって可能??

with open(file_names, 'r') as file_obj:
line = file_obj.readline()
while line:
...

By bluprince13 | 質問日時: 2017年9月15日 10:15



回答1:

fileinputモジュールのinputを使えばいいよ。
これは複数のファイルから読み込むんだけど、文字列があたかも単一のファイルから来てるように見せるんだ (レイジーライン反復)。

import fileinput
files= ['F:/files/a.txt','F:/files/c.txt','F:/files/c.txt']
allfiles = fileinput.input(files)
for line in allfiles: # これはすべてのファイルの行をループする
print(line)
# またはallfiles.readline()でもいい

1つの場所にすべてのテキストが必要な場合は StringIOを使えばいいよ

import io
files= ['F:/files/a.txt','F:/files/c.txt','F:/files/c.txt']
lines = io.StringIO() #すべての行を格納するオブジェクトのようなファイル
for file_dir in files:
with open(file_dir, 'r') as file:
lines.write(file.read())
lines.write('\n')
lines.seek(0) # これでオブジェクトのようなファイルのように扱えるようになった
print(lines.read())

By Anonta | 回答日時: 2017年9月15日 10:36



回答2:

こんなのはどう?

def read_files(*filenames):
for filename in filenames:
with open(filename,'r') as file_obj:
for line in file_obj:
yield line

こんな風に呼び出せる:

for line in read_files("f1.txt", "f2.txt", "f3.txt"):
#... lineを使って何かする

それか

filenames = ["f1.txt", "f2.txt", "f3.txt"]
for line in read_files(*filenames):
#... lineを使って何かする

By Lohmar ASHAR | 回答日時: 2017年9月15日 10:26



回答3:

multiple_filesがすべてのファイル名を含むリストであるとしよう

multiple_files = ["file1.txt", "file2.txt", "file3.txt", ...] # などなど、、、

すべてを放り込む出力ファイルを開く

f = open("multiple_files.txt", "w")
for _file in multiple_files:
f.write(_file.read())

この方法だと、ファイルの各行をいちいち読む必要はないよ。

上記の方法は簡単だけど、fileinput モジュールでも代替できる:

fileinput docs

fileinputを使用すると、複数のファイルにアクセスして処理することができるよ。


with fileinput.input(files=('file1.txt', 'file2.txt')) as f:
for line in f:
process(line)

By bhansa | 回答日時: 2017年9月18日 17:19



Source: Concatenate multiple files into a single file object without creating a new file

共有 コメント