web-dev-qa-db-fra.com

Comment concaténer des fichiers en Python?

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?

37
Owen

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.

48
nosklo

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
34
Nathan Fellman

Hmm. Je n'utiliserai pas de "lignes". Utilisation rapide et sale

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

;)

6
tuergeist

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)
1
Zababa