[Tutor] renaming files within a directory
davidwilson at Safe-mail.net
davidwilson at Safe-mail.net
Mon Jul 27 16:14:24 CEST 2009
Thank you all for your help.
-------- Original Message --------
From: Dave Angel <davea at ieee.org>
Apparently from: SRS0=PAJG=DU=ieee.org=davea at srs.perfora.net
To: davidwilson at Safe-mail.net
Cc: kent37 at tds.net, tutor at python.org
Subject: Re: Re: [Tutor] renaming files within a directory
Date: Mon, 27 Jul 2009 09:01:58 -0400
> 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?
I just cut and paste from vim.
Here is the final code:
import glob
import csv
from os import rename
countries = {}
reader = csv.reader(open("countries.csv"))
for row in reader:
code, name = row
countries[name] = code
files = set([file for file in glob.glob('Flag_of_*.svg')])
for filename in files:
fn = filename[8:-4]
if fn.startswith('the_'):
fn = fn[4:]
if fn in countries:
new_filename = 'flag-%s.svg' % countries[fn]
rename(filename, new_filename)
>
> DaveA
More information about the Tutor
mailing list