如何使Python的检查,如果FTP目录是否存在?(How to make Python check

2019-07-29 20:27发布

我使用这个脚本连接到示例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到它,然后执行一些其他的代码和退出; 如果不执行代码马上退出?

Answer 1:

NSLT将列出FTP服务器中的所有文件的数组。 只是检查,如果你的文件夹名称是存在的。

from ftplib import FTP 
ftp = FTP('yourserver')
ftp.login('username', 'password')

folderName = 'yourFolderName'
if folderName in ftp.nlst():
    #do needed task 


Answer 2:

您可以使用列表。 例

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


Answer 3:

您可以通过控制连接发送“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



Answer 4:

连接到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连接。



Answer 5:

汤姆是正确的,但没有人投他,但对于谁投了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和瞧善良如下.. 。

维奈和乔纳森是正确的对他们评论什么。



Answer 6:

在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())]列表中方法的功能补偿,并调用它时,你会只是需要检查的目录(或文件)存在。



Answer 7:

=>我发现这个网页,而谷歌搜索的方法来检查文件是否存在使用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服务器,例如,不允许因为它包含了太多太多的子目录上列出/埃德加/数据。 在这种情况下,我将无法使用“列表,并检查它是否存在”这里描述的方法 - 在这种情况下,我将不得不使用异常处理我的下载脚本从不存在的文件/目录的访问尝试恢复。



Answer 8:

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


文章来源: How to make Python check if ftp directory exists?
标签: python ftp