How do I concatenate files in Python?

Question:

I have multiple (between 40 and 50) MP3 files that I’d like to concatenate into one file. What’s the best way to do this in Python?

Use fileinput module to loop through each line of each file and write it to an output file? Outsource to windows copy command?

Asked By: Owen

||

Answers:

Putting the bytes in those files together is easy… however I am not sure if that will cause a continuous play – I think it might if the files are using the same bitrate, but I’m not sure.

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

That will create a single “everything.mp3” file with all bytes of all mp3 files in C:music concatenated together.

If you want to pass the names of the files in command line, you can use sys.argv[1:] instead of iglob(...), etc.

Answered By: nosklo

Hmm. I won’t use “lines”. Quick and dirty use

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

😉

Answered By: tuergeist

Just to summarize (and steal from nosklo’s answer), in order to concatenate two files you do:

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

This is the same as:

cat file1 file2 > destination
Answered By: Nathan Fellman

Improving on Clint and nosklo, knowing context manager, I find it cleaner to write this:

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)
Answered By: Zababa
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.