[Tutor] renaming files within a directory

Dave Angel davea at ieee.org
Mon Jul 27 15:01:58 CEST 2009


davidwilson at Safe-mail.net wrote:
> Here is the updated viersion:
>
> ---
>
> import glob
> import csv
> from os import rename
>
>
> countries =}
> reader =sv.reader(open("countries.csv"))
> for row in reader:
>     code, name =ow
>     countries[name] =ode
>
> files =et([file for file in glob.glob('Flag_of_*.svg')])
>
> for file in files:
>     file =ile[8:-4]
>     if file.startswith('the_'):
> 	file =ile[4:]
>     if countries.has_key(file):
> 	b =flag-'+ countries[file] + '.svg'
> 	print b
> 	rename(file, b)
>
> But I cannot get the rename to take effect and I get an error:
>
> $ python rename_svg.py 
> Uganda flag-ug.svg
> Traceback (most recent call last):
>   File "rename_svg.py", line 21, in <module>
>     rename(file, b)
> OSError: [Errno 2] No such file or directory
>
> What am I missing?
>
> -------- Original Message --------
> From: Kent Johnson <kent37 at tds.net>
> Apparently from: kent3737 at gmail.com
> To: davidwilson at safe-mail.net
> Cc: mail at timgolden.me.uk, tutor at python.org
> Subject: Re: [Tutor] renaming files within a directory
> Date: Mon, 27 Jul 2009 07:01:32 -0400
>
>   
>> On Mon, Jul 27, 2009 at 5:10 AM, <davidwilson at safe-mail.net> wrote:
>>
>>     
>>> files =et([file for file in os.listdir(os.getcwd()) if file.endswith('svg')])
>>> print len(files)
>>>
>>> for file in files:
>>>    file =ile.strip('.svg')
>>>    print file
>>> #    if countries.has_key(file):
>>> #       print file
>>>
>>> When I run this I get:
>>>
>>> Flag_of_Uganda
>>> ...
>>>
>>> The problem is that for example the file Flag_of_the_United_States.svg when I use the strip('.svg') it is returned as Flag_of_the_United_State
>>>
>>> Also, How do I remove 'Flag_of', 'Flag_of_the_'
>>>       
>> I suggest you use glob.glob() instead of os.listdir():
>>
>> files =lob.glob('Flag_of_*.svg)
>>
>> Then you know that each file name starts with Flag_of_ and ends with
>> .svg. To remove them, since they are fixed strings you can just use
>> slicing;
>> file =ile[8:-4]
>> if file.startswith('the_'):
>>   file =ile[4:]
>>
>> Kent
>>     
>
> (Please don't top-post on this mailing list.  It hopelessly confuses which order the quoted messages come.)
>   

One reason the rename() will fail is that you're changing file between 
the for loop and the rename.  Incidentally, file is a lousy name to use, 
since it already has a meaning in the std lib.  It's the type of the 
object you get from open(), or from glob.glog().


I didn't check the rest, but for this change, you'd get:

for infile in files:
    country = infile[8:-4]
    if country.startswith('the_'):
	country = country[4:]
    if countries.has_key(file):
	b = 'flag-'+ countries[country] + '.svg'
	print b
	rename(file, b)


BTW, several other characters were dropped in your email.  Did you 
retype the code (bad), or use cut/paste?

DaveA



More information about the Tutor mailing list