我使用这个脚本连接到示例FTP服务器,并列出可目录:
from ftplib import FTP
ftp = FTP('ftp.cwi.nl') # connect to host, default port (some example server, i'll use other one)
ftp.login() # user anonymous, passwd anonymous@
ftp.retrlines('LIST') # list directory contents
ftp.quit()
如何使用ftp.retrlines(“LIST”)输出到检查目录(例如的public_html)是否存在,如果存在cd到它,然后执行一些其他的代码和退出; 如果不执行代码马上退出?
NSLT将列出FTP服务器中的所有文件的数组。 只是检查,如果你的文件夹名称是存在的。
from ftplib import FTP
ftp = FTP('yourserver')
ftp.login('username', 'password')
folderName = 'yourFolderName'
if folderName in ftp.nlst():
#do needed task
您可以使用列表。 例
import ftplib
server="localhost"
user="user"
password="test@email.com"
try:
ftp = ftplib.FTP(server)
ftp.login(user,password)
except Exception,e:
print e
else:
filelist = [] #to store all files
ftp.retrlines('LIST',filelist.append) # append to list
f=0
for f in filelist:
if "public_html" in f:
#do something
f=1
if f==0:
print "No public_html"
#do your processing here
您可以通过控制连接发送“MLST路径”。 这将返回包括路径(注意“类型= DIR”到这里) 类型的线路:
250-Listing "/home/user":
modify=20131113091701;perm=el;size=4096;type=dir;unique=813gc0004; /
250 End MLST.
翻译成蟒蛇应该是沿着这些路线的东西:
import ftplib
ftp = ftplib.FTP()
ftp.connect('ftp.somedomain.com', 21)
ftp.login()
resp = ftp.sendcmd('MLST pathname')
if 'type=dir;' in resp:
# it should be a directory
pass
当然,上面的代码是不是100%可靠的,需要一个“真正”的解析器。 可以看MLSD命令的ftplib.py实施,这是非常相似的(MLSD从MLST不同之处在于在发送的数据连接,但被传送的行的格式的响应是相同的): HTTP://汞柱.python.org / CPython的/文件/ 8af2dc11464f /库/ ftplib.py#l577
连接到ghostdog74的回答的例子有一点错误的:你回来清单是响应的整条生产线,让你喜欢的东西
drwxrwxrwx 4 5063 5063 4096 Sep 13 20:00 resized
这意味着如果你的目录名称是一样的东西“50”(这是我的情况),你会得到一个假阳性。 我修改了代码来处理这个问题:
def directory_exists_here(self, directory_name):
filelist = []
self.ftp.retrlines('LIST',filelist.append)
for f in filelist:
if f.split()[-1] == directory_name:
return True
return False
NB,这是一个FTP包装类,我写的里面和self.ftp是实际的FTP连接。
汤姆是正确的,但没有人投他,但对于谁投了ghostdog74我会混合和编写代码的满意度,工作对我来说,应该为你工作的家伙。
import ftplib
server="localhost"
user="user"
uploadToDir="public_html"
password="test@email.com"
try:
ftp = ftplib.FTP(server)
ftp.login(user,password)
except Exception,e:
print e
else:
filelist = [] #to store all files
ftp.retrlines('NLST',filelist.append) # append to list
num=0
for f in filelist:
if f.split()[-1] == uploadToDir:
#do something
num=1
if num==0:
print "No public_html"
#do your processing here
首先,如果你遵循鬼狗方法,即使你说目录“公共” F中,甚至当它不存在,因为这个词公众“的public_html”存在,那么,汤姆,如果条件可以这样用多数民众赞成它的值为true我改成如果f.split()[ - 1] == uploadToDir:
此外,如果你输入一个目录名somethig那不存在的,但有些文件和文件夹中存在第二个由ghostdog74永远不会执行,因为它从来没有为0中F覆盖for循环,所以我使用num变量,而不是f和瞧善良如下.. 。
维奈和乔纳森是正确的对他们评论什么。
在3.X nlst()
方法被弃用。 使用此代码:
import ftplib
remote = ftplib.FTP('example.com')
remote.login()
if 'foo' in [name for name, data in list(remote.mlsd())]:
# do your stuff
该list()
被调用所需因为mlsd()
返回一个发电机,他们不支持检查什么是他们(没有__contains__()
方法)。
你可以用[name for name, data in list(remote.mlsd())]
列表中方法的功能补偿,并调用它时,你会只是需要检查的目录(或文件)存在。
=>我发现这个网页,而谷歌搜索的方法来检查文件是否存在使用Python中FTPLIB。 以下是我想通了(希望它可以帮助别人):
=>当尝试列出不存在的文件/目录,FTPLIB抛出一个例外。 即使添加一个try / except块是一个标准的做法,是一个好主意,我宁愿我的FTP脚本只有确保它们的存在后,下载文件(S)。 这有助于保持我的脚本简单 - 列出FTP服务器上的目录至少当是可能的。
例如,埃德加FTP服务器有一个存储在目录/埃德加/日用指数/下的多个文件。 每个文件被命名为喜欢“master.YYYYMMDD.idx”。 有没有保证的文件,将每一个日期(年月日)存在 - 没有注明日期2013年11月24日的文件,但有日的文件:11月22日2013年如何上市工作在这两种情况?
# Code
from __future__ import print_function
import ftplib
ftp_client = ftplib.FTP("ftp.sec.gov", "anonymous", "MY.EMAIL@gmail.com")
resp = ftp_client.sendcmd("MLST /edgar/daily-index/master.20131122.idx")
print(resp)
resp = ftp_client.sendcmd("MLST /edgar/daily-index/master.20131124.idx")
print(resp)
# Output
250-Start of list for /edgar/daily-index/master.20131122.idx
modify=20131123030124;perm=adfr;size=301580;type=file;unique=11UAEAA398;
UNIX.group=1;UNIX.mode=0644;UNIX.owner=1019;
/edgar/daily-index/master.20131122.idx
250 End of list
Traceback (most recent call last):
File "", line 10, in <module>
resp = ftp_client.sendcmd("MLST /edgar/daily-index/master.20131124.idx")
File "lib/python2.7/ftplib.py", line 244, in sendcmd
return self.getresp()
File "lib/python2.7/ftplib.py", line 219, in getresp
raise error_perm, resp
ftplib.error_perm: 550 '/edgar/daily-index/master.20131124.idx' cannot be listed
正如预期的那样,列出一个不存在的文件生成异常。
=>因为我知道,埃德加FTP服务器必将目录/埃德加/日用指数/我的脚本可以执行以下操作,以避免引发由于不存在的文件除外:
一)该目录列出。
B)下载所需的文件(S),如果他们都出现在此房源 - 要检查我通常执行正则表达式搜索列表,字符串列表操作返回的名单上。
例如这个脚本尝试下载文件在过去的三天。 如果发现某个特定日期则下载的文件,否则什么也不会发生。
import ftplib
import re
from datetime import date, timedelta
ftp_client = ftplib.FTP("ftp.sec.gov", "anonymous", "MY.EMAIL@gmail.com")
listing = []
# List the directory and store each directory entry as a string in an array
ftp_client.retrlines("LIST /edgar/daily-index", listing.append)
# go back 1,2 and 3 days
for diff in [1,2,3]:
today = (date.today() - timedelta(days=diff)).strftime("%Y%m%d")
month = (date.today() - timedelta(days=diff)).strftime("%Y_%m")
# the absolute path of the file we want to download - if it indeed exists
file_path = "/edgar/daily-index/master.%(date)s.idx" % { "date": today }
# create a regex to match the file's name
pattern = re.compile("master.%(date)s.idx" % { "date": today })
# filter out elements from the listing that match the pattern
found = filter(lambda x: re.search(pattern, x) != None, listing)
if( len(found) > 0 ):
ftp_client.retrbinary(
"RETR %(file_path)s" % { "file_path": file_path },
open(
'./edgar/daily-index/%(month)s/master.%(date)s.idx' % {
"date": today
}, 'wb'
).write
)
=>有趣的是,在这里我们无法列出FTP服务器上的目录的情况。 埃德加FTP服务器,例如,不允许因为它包含了太多太多的子目录上列出/埃德加/数据。 在这种情况下,我将无法使用“列表,并检查它是否存在”这里描述的方法 - 在这种情况下,我将不得不使用异常处理我的下载脚本从不存在的文件/目录的访问尝试恢复。
from ftplib import FTP
ftp = FTP()
ftp.connect(hostname, 21)
ftp.login(username,password)
try:
ftp.cwd('your folder name')
#do the code for successfull cd
except Exception:
#do the code for folder not exists