38 votes

Comment concaténer des fichiers en Python ?

J'ai plusieurs (entre 40 et 50) fichiers MP3 que je voudrais concaténer en un seul fichier. Quelle est la meilleure façon de le faire en Python ?

Utilice fileinput pour parcourir en boucle chaque ligne de chaque fichier et l'écrire dans un fichier de sortie ? Externaliser vers Windows copy commande ?

1 votes

0 votes

Cela répond-il à votre question ? Python concaténation de fichiers texte

52voto

nosklo Points 75862

Il est facile d'assembler les octets de ces fichiers... mais je ne suis pas sûr que cela provoque une lecture continue - je pense que c'est possible si les fichiers utilisent le même débit binaire, mais je n'en 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 le fichier "everything.mp3". 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.

0 votes

Vous n'avez pas besoin de l'étape fullname ici, glob produit déjà des noms de fichiers absolus.

0 votes

Et vous pouvez utiliser iglob, au lieu de glob

0 votes

Je n'ai aucune idée si cela va provoquer un jeu continu ou non - je suppose que je vais le découvrir - et peut-être poser une autre question à ce sujet... haha.

35voto

Nathan Fellman Points 31310

Juste pour résumer (et voler de La réponse de nosklo ), afin de concaténer deux fichiers, 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

0 votes

J'ai essayé de le faire, mais pour une raison quelconque, je n'obtiens que le premier fichier, et pas le deuxième fichier ajouté. Les deux fichiers sont des mp4

0 votes

Cela fonctionne très bien pour moi ! Vous pouvez faire cela en une ligne de moins en utilisant une instruction with.

6voto

tuergeist Points 3718

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

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

;)

2voto

Zababa Points 391

En améliorant 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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X