planetthoughtful wrote: > Hi All, > > I've written my first piece of practical Python code (included below), > and would appreciate some comments. My situation was that I had a > directory with a number of subdirectories that contained one or more > zip files in each. Many of the zipfiles had the same filename (which is > why they had previously been stored in separate directories). I wanted > to bring all of the zip files (several hundrd in total) down to the > common parent directory and obviously rename them in the process by > appending a unique string to each filename. > > The code below did the job admirably, but I don't imagine it is > anywhere near as efficiently written as it could and should be. Note: > I'm aware there was no need, for example, to wrap the "os.walk(path)" > statement in a def -- in a couple of places I added extra steps just to > help familiarize myself with Python syntax. > > I'd very much like to see how experienced Python coders would have > achieved the same task, if any of you can spare a couple of minutes to > share some knowledge with me. > > Many thanks and much warmth, > > planetthoughtful > > import os > fcount = 0 > path = 'X:\zipfiles' > def listFiles(path): > mylist = os.walk(path) > return mylist
Note that os.walk() doesn't return a list, it returns an iterable object (a generator). Your usage will work for either, but your names are misnomers. > > filelist = listFiles(path) > for s in filelist: I would write for dirpath, dirnames, filenames in filelist: which gives names to what you call s[0] and s[2] or just for dirpath, dirnames, filenames in os.walk(path): Kent > if len(s[2]) > 0: > for f in s[2]: > pad = str(fcount) > if len(pad) == 1: > pad = "00" + pad > elif len(pad) == 2: > pad = "0" + pad > > (fname, fext) = os.path.splitext(f) > oldname = f > newname = fname + "_" + pad + fext > os.rename(s[0] + "\\" + oldname, path + "\\" + newname) > fcount = fcount + 1 > -- http://mail.python.org/mailman/listinfo/python-list