Ube*_*per 15 python ftp ftplib
如何使用ftplib检查远程ftp上的文件是否是文件夹?
我现在最好的方法是做一个nlst,并遍历每个文件的调用大小,如果文件出错那么它是一个文件夹?
有没有更好的办法?我无法解析列表的输出,因为有大约十几个不同的ftp服务器(很多很老.)
我该怎么办?
FTP是一个相当基本的协议,并没有内置协议的查询,让您获得每个节点的类型(文件,目录),所以像你找到了一个启发是唯一的解决办法.
如果获得每个节点的大小不起作用,也许您应该考虑调用FTP.nlst()
每个节点:那些错误输出将是文件而不是dirs.
您可以使用 MLST 命令:
import ftplib
f = ftplib.FTP()
f.connect("localhost")
f.login()
print f.sendcmd('MLST /')
Run Code Online (Sandbox Code Playgroud)
针对pyftpdlib 服务器,上面的代码打印:
250-Listing "/":
modify=20111212124834;perm=el;size=12288;type=dir;unique=807g100001; /
250 End MLST.
Run Code Online (Sandbox Code Playgroud)
您要做的就是解析该字符串并通过以下方式查找“type=dir”或“type=cdir”(当前目录,如“.”)或“type=pdir”(父目录,如“..”)一个正则表达式。如果匹配,则意味着提供的路径引用了一个目录。
ftplib中没有"isdir"和"isfile"定义.如果您不必使用ftplib,我建议您使用ftputil.
首先,你必须安装ftputil包.要实现此目的,请使用以下命令:python -m pip install ftputil
.安装后,您可以将库导入到您的代码中.我认为这是足够的解释.那么,让我们来实现:
import ftputil
with ftputil.FTPHost("host", "username", "password") as ftp_host:
ftp_host.chdir("/directory/")
list = ftp_host.listdir(ftp_host.curdir)
for fname in list:
if ftp_host.path.isdir(fname):
print(fname + " is a directory")
else:
print(fname + " is not a directory")
Run Code Online (Sandbox Code Playgroud)
FTP.dir
返回一个目录列表,您可以使用回调函数对其进行解析以查明它是否是一个目录。例如,像这样:
def parse(line):
if line[0] == 'd':
print(line.rpartition(' ')[2]) # gives you the name of a directory
ftp.dir(parse)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13390 次 |
最近记录: |