ftp - delete multiple files of same type

chris.annin at gmail.com chris.annin at gmail.com
Tue Feb 5 17:59:12 EST 2013


> 
> > im trying to delete all text files from an ftp directory. is there a way to delete multiple files of the same extension?
> 
> >
> 
> > I came up with the following code below which works but I have to append the string because ftp.nlst returns:
> 
> >
> 
> > "-rwx------ 1 user group 0 Feb 04 15:57 New Text Document.txt"
> 
> >
> 
> > but then when I try to delete it that long file name which includes the date doesnt exist - the files name is "new text document.txt" not "-rwx------ 1 user group 0 Feb 04 15:57 New Text Document.txt"
> 
> >
> 
> > so anyway I stripped off the the beginning keeping the last 21 characters and it worked great - this should work being that I know all my text files names are the same length in characters - but it seems like there should be a better more bullet proof way to do this?
> 
> >
> 
> > [code]import os
> 
> > import system
> 
> > from ftplib import FTP
> 
> >
> 
> > ftp = FTP('127.0.0.1')
> 
> > ftp.login('')
> 
> >
> 
> > directory = 'test'
> 
> > ftp.cwd(directory)
> 
> >
> 
> > files = ftp.nlst()
> 
> >
> 
> > for file in files:
> 
> >      if file.find(".txt") != -1:
> 
> >          file = (file [-21:])
> 
> >          ftp.delete(file)
> 
> >
> 
> > ftp.close()[/code]
> 
> >
> 
> > any ideas on this?  thank you.
> 
> >
> 
> Firstly, instead of:
> 
> 
> 
>     file.find(".txt") != -1
> 
> 
> 
> use:
> 
> 
> 
>      file.endswith(".txt")
> 
> 
> 
> It's clearer (and it's true only if the ".txt" is at the end!)
> 
> 
> 
> Secondly, your code assumes that the filename is exactly 21 characters.
> 
> It looks like the strings returned by ftp.nlst() consist of 9 fields
> 
> separated by whitespace, with the last field being the filename,
> 
> which can also contain spaces. That being so, you can split the strings
> 
> like this:
> 
> 
> 
>      fields = file.split(None, 9)
> 
> 
> 
> That'll make a maximum of 9 splits on any whitespace, for example:
> 
> 
> 
>  >>> "-rwx------ 1 user group 0 Feb 04 15:57 New Text 
> 
> Document.txt".split(None, 9)
> 
> ['-rwx------', '1', 'user', 'group', '0', 'Feb', '04', '15:57', 'New', 
> 
> 'Text Document.txt']
> 
> 
> 
> Therefore:
> 
> 
> 
> for entry in ftp.nlst():
> 
>      if entry.endswith(".txt"):
> 
>          filename = entry.split(None, 9)[-1]
> 
>          ftp.delete(filename)

On Tuesday, February 5, 2013 10:45:02 AM UTC-8, MRAB wrote:
> On 2013-02-05 17:29, chris.annin at gmail.com wrote:
> 
> > im trying to delete all text files from an ftp directory. is there a way to delete multiple files of the same extension?
> 
> >
> 
> > I came up with the following code below which works but I have to append the string because ftp.nlst returns:
> 
> >
> 
> > "-rwx------ 1 user group 0 Feb 04 15:57 New Text Document.txt"
> 
> >
> 
> > but then when I try to delete it that long file name which includes the date doesnt exist - the files name is "new text document.txt" not "-rwx------ 1 user group 0 Feb 04 15:57 New Text Document.txt"
> 
> >
> 
> > so anyway I stripped off the the beginning keeping the last 21 characters and it worked great - this should work being that I know all my text files names are the same length in characters - but it seems like there should be a better more bullet proof way to do this?
> 
> >
> 
> > [code]import os
> 
> > import system
> 
> > from ftplib import FTP
> 
> >
> 
> > ftp = FTP('127.0.0.1')
> 
> > ftp.login('')
> 
> >
> 
> > directory = 'test'
> 
> > ftp.cwd(directory)
> 
> >
> 
> > files = ftp.nlst()
> 
> >
> 
> > for file in files:
> 
> >      if file.find(".txt") != -1:
> 
> >          file = (file [-21:])
> 
> >          ftp.delete(file)
> 
> >
> 
> > ftp.close()[/code]
> 
> >
> 
> > any ideas on this?  thank you.
> 
> >
> 
> Firstly, instead of:
> 
> 
> 
>     file.find(".txt") != -1
> 
> 
> 
> use:
> 
> 
> 
>      file.endswith(".txt")
> 
> 
> 
> It's clearer (and it's true only if the ".txt" is at the end!)
> 
> 
> 
> Secondly, your code assumes that the filename is exactly 21 characters.
> 
> It looks like the strings returned by ftp.nlst() consist of 9 fields
> 
> separated by whitespace, with the last field being the filename,
> 
> which can also contain spaces. That being so, you can split the strings
> 
> like this:
> 
> 
> 
>      fields = file.split(None, 9)
> 
> 
> 
> That'll make a maximum of 9 splits on any whitespace, for example:
> 
> 
> 
>  >>> "-rwx------ 1 user group 0 Feb 04 15:57 New Text 
> 
> Document.txt".split(None, 9)
> 
> ['-rwx------', '1', 'user', 'group', '0', 'Feb', '04', '15:57', 'New', 
> 
> 'Text Document.txt']
> 
> 
> 
> Therefore:
> 
> 
> 
> for entry in ftp.nlst():
> 
>      if entry.endswith(".txt"):
> 
>          filename = entry.split(None, 9)[-1]
> 
>          ftp.delete(filename)


wow, thank you very much thats a huge help.

Chris



More information about the Python-list mailing list