Finding and copying files with python.

gtb goodTweetieBird at hotmail.com
Tue Apr 3 10:55:31 EDT 2007


On Apr 3, 9:42 am, "Daniele Varrazzo" <daniele.varra... at gmail.com>
wrote:
> > > > 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

Thanks all. Much to learn, but you have certainly helped me get
started.

jh




More information about the Python-list mailing list