web-dev-qa-db-ja.com

Pythonでファイルを連結するにはどうすればよいですか?

複数(40〜50)のMP3ファイルを1つのファイルに連結したい。 Pythonでこれを行う最良の方法は何ですか?

fileinput モジュールを使用して、各ファイルの各行をループし、出力ファイルに書き込みますか? Windowsにアウトソース copy コマンド?

37
Owen

それらのファイルのバイトをまとめることは簡単です...しかし、それが継続的な再生を引き起こすかどうかはわかりません-ファイルが同じビットレートを使用しているのではないかと思いますが、わかりません。

_from glob import iglob
import shutil
import os

PATH = r'C:\music'

destination = open('everything.mp3', 'wb')
for filename in iglob(os.path.join(PATH, '*.mp3')):
    shutil.copyfileobj(open(filename, 'rb'), destination)
destination.close()
_

これにより、C:\ music内のすべてのmp3ファイルのすべてのバイトが連結された単一の「everything.mp3」ファイルが作成されます。

コマンドラインでファイルの名前を渡したい場合は、iglob(...)などの代わりに_sys.argv[1:]_を使用できます。

48
nosklo

要約するだけで(そして noskloの答え から盗みます)、2つのファイルを連結するには、次のようにします。

destination = open(outfile,'wb')
shutil.copyfileobj(open(file1,'rb'), destination)
shutil.copyfileobj(open(file2,'rb'), destination)
destination.close()

これは次と同じです:

cat file1 file2 > destination
34
Nathan Fellman

うーん。 「行」は使いません。すばやく汚れた使用

outfile.write( file1.read() )
outfile.write( file2.read() )

;)

6
tuergeist

Clintとnoskloを改善し、コンテキストマネージャを知っているので、次のように書くとわかりやすくなります。

import shutil
import pathlib

source_files = pathlib.Path("My_Music").rglob("./*.mp3")
with open("concatenated_music.mp3", mode="wb") as destination:
    for file in source_files:
        with open(file, mode="rb") as source:
            shutil.copyfileobj(source, destination)
1
Zababa