ftplib检查文件是否是文件夹?

Ube*_*per 15 python ftp ftplib

如何使用ftplib检查远程ftp上的文件是否是文件夹?

我现在最好的方法是做一个nlst,并遍历每个文件的调用大小,如果文件出错那么它是一个文件夹?

有没有更好的办法?我无法解析列表的输出,因为有大约十几个不同的ftp服务器(很多很老.)

我该怎么办?

Ant*_* P. 7

FTP是一个相当基本的协议,并没有内置协议的查询,让您获得每个节点的类型(文件,目录),所以像你找到了一个启发是唯一的解决办法.

如果获得每个节点的大小不起作用,也许您应该考虑调用FTP.nlst()每个节点:那些错误输出将是文件而不是dirs.


Gia*_*olà 6

您可以使用 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”(父目录,如“..”)一个正则表达式。如果匹配,则意味着提供的路径引用了一个目录。


Cey*_* B. 5

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)


Sil*_*ost 4

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)

  • 但输出不标准,所以没用。 (2认同)