2009-06-16 22 views
33

Tengo múltiples (entre 40 y 50) archivos MP3 que me gustaría concatenar en un solo archivo. ¿Cuál es la mejor manera de hacer esto en Python?¿Cómo concateno archivos en Python?

Utilice el módulo fileinput para recorrer cada línea de cada archivo y escribirlo en un archivo de salida? Subcontratar al comando windows copy?

+0

http://stackoverflow.com/a/27077437/1157720 – sajjadG

Respuesta

44

Poner los bytes en esos archivos juntos es fácil ... sin embargo, no estoy seguro si eso causará una reproducción continua, creo que podría ser si los archivos están usando la misma velocidad de bits, pero no estoy seguro.

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

que creará un único archivo "everything.mp3" con todos los bytes de todos los archivos mp3 en C: \ música concatenan juntos.

Si desea pasar los nombres de los archivos en la línea de comandos, se puede utilizar en lugar de sys.argv[1:]iglob(...), etc.

+0

No necesita el paso de nombre completo allí, glob ya está produciendo nombres de archivo absolutos. – SilentGhost

+0

y puede usar iglob, en lugar de glob – SilentGhost

+0

@SilentGhost: gracias, solucionado – nosklo

5

Hmm. No usaré "líneas". el uso rápido y sucio

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

;)

+0

Aunque esto no funcionará para moscas muy grandes. –

+2

Sí, lo sé. Pero. Escribí "rápido y sucio". Eso implica: sin garantías ... – tuergeist

32

Sólo para resumir (y roban a nosklo's answer), con el fin de concatenar dos archivos que haces:

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

Esto es lo mismo que:

cat file1 file2 > destination