Как объединить файлы в Python?

У меня есть несколько (от 40 до 50) файлов MP3, которые я хотел бы объединить в один файл. Какой лучший способ сделать это в Python?

Использовать модуль fileinput для прокрутки каждой строки каждого файла и записи в выходной файл? Аутсорсинг для Windows copy команда?

Ответ 1

Поставить байты в эти файлы вместе легко... однако я не уверен, что это вызовет непрерывную игру - я думаю, это может быть, если файлы используют один и тот же бит, но я не уверен.

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()

Это создаст единственный файл "everything.mp3" со всеми байтами всех mp3 файлов в C:\music, объединенных вместе.

Если вы хотите передать имена файлов в командной строке, вы можете использовать sys.argv[1:] вместо iglob(...) и т.д.

Ответ 2

Просто, чтобы суммировать (и украсть из nosklo answer), чтобы объединить два файла, которые вы делаете:

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

Это то же самое, что:

cat file1 file2 > destination

Ответ 3

Хм. Я не буду использовать "строки". Быстрое и грязное использование

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

;)

Ответ 4

Совершенствуясь в Клинте и Носкло, зная менеджер контекста, я нахожу чище написать:

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)