J'ai plusieurs (entre 40 et 50) fichiers MP3 que j'aimerais concaténer en un seul fichier. Quelle est la meilleure façon de le faire en Python?
Utilisez le module fileinput
pour parcourir chaque ligne de chaque fichier et l'écrire dans un fichier de sortie? Sous-traiter à Windows copy
commande?
Il est facile de rassembler les octets de ces fichiers ... mais je ne sais pas si cela entraînera une lecture continue - je pense que cela pourrait se produire si les fichiers utilisent le même débit, mais je ne suis pas sûr.
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()
Cela créera un seul fichier "everything.mp3" avec tous les octets de tous les fichiers mp3 dans C:\music concaténés ensemble.
Si vous voulez passer les noms des fichiers en ligne de commande, vous pouvez utiliser sys.argv[1:]
Au lieu de iglob(...)
, etc.
Juste pour résumer (et voler de réponse de nosklo ), afin de concaténer deux fichiers que vous faites:
destination = open(outfile,'wb')
shutil.copyfileobj(open(file1,'rb'), destination)
shutil.copyfileobj(open(file2,'rb'), destination)
destination.close()
C'est la même chose que:
cat file1 file2 > destination
Hmm. Je n'utiliserai pas de "lignes". Utilisation rapide et sale
outfile.write( file1.read() )
outfile.write( file2.read() )
;)
Améliorant sur Clint et nosklo, connaissant le gestionnaire de contexte, je trouve plus propre d'écrire ceci:
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)