Как объединить файлы в 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)