Finding and copying files with python.

Daniele Varrazzo daniele.varrazzo at gmail.com
Tue Apr 3 16:42:49 CEST 2007


> > > I wish to copy   the highest version number of a file from directory \
> > > \
> > > \fileserver\D:\scripts to C:\scripts where the file names are of the
> > > form
>
> > > filename_MM.NN.SS.zip, where MM, NN, and SS can be one to three
> > > digits.
>
> > > Example directory:
> > > other.zip
> > > dx_ver_1.1.63.zip
> > > dx_ver_1.2.01.zip
> > > dx_ver_1.12.7.zip
> > > temp.txt
>
> > > Does python have string matching routines  that would find the bottom
> > > listed zip file and/or file copying routines?

> > You could just use string slicing to cut off the first 7 characters
> > and have the numbers available to compare. There's also the os.stat
> > module to find the last modified date of the file. You might be able
> > to use the glob module to grab a list of the files and then sort the
> > list too.

Comparing the version strings is not enough: you have to convert the
parts into integers, because else:

>>> "dx_ver_1.12.7.zip" < "dx_ver_1.2.1.zip"
True

> Thanks for posting folks. I didn't make my question clear. Before I
> sort the files I need to ensure that I am only sorting the files that
> match the profile of "filename_MM.NN.SS.zip", where MM, NN, and SS can
> be one to three
> digits.

Match the file names against the pattern "dx_ver_(\d+).(\d+).(\d
+).zip". You may also use the glob function, but then you will have to
parse the version number from the file name anyway: with the regexp
you can use match.groups() to get the version number.

You can do:

import re
ver_re = re.compile(r"dx_ver_(\d+).(\d+).(\d+).zip")

def getVer(fn):
    """Return a *comparable* file version, None for bad file names"""
    m = ver_re.match(fn)
    return m and map(int, m.groups())

print sorted(os.listdir('/path/to/wherever'), key=getVer)[-1]

--Daniele

P.S. I guess in Obfuscated Python one would write something like:

>>> print sorted((pair for pair in ((re.match(r"dx_ver_(\d+).(\d+).(\d+).zip", fn), fn) for fn in os.listdir('/path/to/wherever')) if pair[0]), key=lambda _: map(int, _[0].groups()))[-1][1]
dx_ver_1.12.7.zip




More information about the Python-list mailing list