[Tutor] Using subprocess on a series of files with spaces

C Smith illusiontechniques at gmail.com
Fri Aug 1 01:23:55 CEST 2014


or more accurately
import os, subprocess, re
directory = '/abs/path'
for track, filename in enumerate(os.listdir(directory), 1):
    pathname = os.path.join(directory, filename)
    subprocess.call(['ffmpeg', '-i', pathname, filename[:-5]+'.mp3'])

On Thu, Jul 31, 2014 at 7:13 PM, C Smith <illusiontechniques at gmail.com> wrote:
> thanks, got it
> import os, subprocess, re
> directory = 'abs/path'
> for track, filename in enumerate(os.listdir(directory), 1):
>     pathname = os.path.join(directory, filename)
>     subprocess.call(['ffmpeg', '-i', pathname, filename+str(track)+'.mp3'])
>
> On Thu, Jul 31, 2014 at 7:02 PM, C Smith <illusiontechniques at gmail.com> wrote:
>> Huh, that is quite an annoyance about changing the order though. Any
>> ideas about that? I will look into it further in the meantime...
>>
>> On Thu, Jul 31, 2014 at 6:57 PM, C Smith <illusiontechniques at gmail.com> wrote:
>>> Works now, thanks!
>>>
>>> On Thu, Jul 31, 2014 at 6:57 PM, C Smith <illusiontechniques at gmail.com> wrote:
>>>> woops, I see it pathname != filename
>>>>
>>>> On Thu, Jul 31, 2014 at 6:55 PM, C Smith <illusiontechniques at gmail.com> wrote:
>>>>>>for track, filename in enumerate(os.listdir(directory), 1):
>>>>> It seems kinda counter-intuitive to have track then filename as
>>>>> variables, but enumerate looks like it gets passed the filename then
>>>>> track number. Is that correct and just the way enumerate works, a
>>>>> typo, or am I missing something else here?
>>>>>
>>>>> It is an ffmpeg error I am getting.
>>>>> ffmpeg just gives its usual build information and the error is (for
>>>>> each song title in the directory):
>>>>> songTitleIsHere.flac: no such file or directory
>>>>>
>>>>> So it looks like it is close to working because it finds the correct
>>>>> file names, but doesn't recognize it for some reason.
>>>>> Here is how I put in your code
>>>>> import os, subprocess
>>>>> directory = '/absolute/path/goes/here'
>>>>> for track, filename in enumerate(os.listdir(directory), 1):
>>>>>     pathname = os.path.join(directory, filename)
>>>>>     subprocess.call(['ffmpeg', '-i', filename, str(track)+'.mp3'])
>>>>>
>>>>> So it goes to the right place, because every song title is listed out,
>>>>> ffmpeg or the shell just don't recognize them correctly.
>>>>>
>>>>> On Thu, Jul 31, 2014 at 6:35 PM, Steven D'Aprano <steve at pearwood.info> wrote:
>>>>>> You may have already have solved your problem, unfortunately my
>>>>>> emails are coming in slowly and out of order, but I have a suggestion:
>>>>>>
>>>>>> On Thu, Jul 31, 2014 at 03:53:48PM -0400, C Smith wrote:
>>>>>>> I am on OSX, which needs to escape spaces in filenames with a backslash.
>>>>>>
>>>>>> Same as any other Unix, or Linux, or, indeed, Windows.
>>>>>>
>>>>>>> There are multiple files within one directory that all have the same
>>>>>>> structure, one or more characters with zero or more spaces in the
>>>>>>> filename, like this:
>>>>>>> 3 Song Title XYZ.flac.
>>>>>>> I want to use Python to call ffmpeg to convert each file to an .mp3.
>>>>>>> So far this is what I was trying to use:
>>>>>>> import os, subprocess
>>>>>>> track = 1
>>>>>>> for filename in os.listdir('myDir'):
>>>>>>>     subprocess.call(['ffmpeg', '-i', filename, str(track)+'.mp3'])
>>>>>>>     track += 1
>>>>>>
>>>>>> I believe that your problem is *not* the spaces, but that you're passing
>>>>>> just the filename and not the directory. subprocess will escape the
>>>>>> spaces for you. Also, let Python count the track number for you. Try
>>>>>> this:
>>>>>>
>>>>>>
>>>>>> directory = '/path/to/the/directory'
>>>>>> for track, filename in enumerate(os.listdir(directory), 1):
>>>>>>     pathname = os.path.join(directory, filename)
>>>>>>     subprocess.call(['ffmpeg', '-i', filename, str(track)+'.mp3'])
>>>>>>
>>>>>>
>>>>>> I expect something like that will work. You should be able to pass
>>>>>> either an absolute path (beginning with /) or a relative path starting
>>>>>> from the current working directory.
>>>>>>
>>>>>> If this doesn't work, please show the full error that you receive. If it
>>>>>> is a Python traceback, copy and paste the whole thing, if it's an ffmpeg
>>>>>> error, give as much information as you can.
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Steven
>>>>>> _______________________________________________
>>>>>> Tutor maillist  -  Tutor at python.org
>>>>>> To unsubscribe or change subscription options:
>>>>>> https://mail.python.org/mailman/listinfo/tutor


More information about the Tutor mailing list