Python 带FTP的递归文件列表

Python 带FTP的递归文件列表,python,ftp,ftplib,Python,Ftp,Ftplib,我知道如何从FTP服务器列出目录中的所有文件: import ftplib ftp = ftplib.FTP() ftp.connect("192.168.1.18", port=2240) ftp.login() ftp.cwd('path/to') for f in ftp.mlsd(): print(f) 但是获取递归文件列表(即子目录、子目录等中的文件)的最佳方法是什么? i、 e.Python3的glob.glob('path/to/***',recurs

我知道如何从FTP服务器列出目录中的所有文件:

import ftplib
ftp = ftplib.FTP()
ftp.connect("192.168.1.18", port=2240)
ftp.login()
ftp.cwd('path/to')
for f in ftp.mlsd():
    print(f)
但是获取递归文件列表(即子目录、子目录等中的文件)的最佳方法是什么?

i、 e.Python3的
glob.glob('path/to/***',recursive=True)
的FTP等价物,它递归地列出所有文件

我可以手动输入每个目录,然后重做一个
msld()
,但我担心这会非常慢(在FTP中列出文件就我所记得的来说已经很慢了),所以这不是最优的

如何使用SFTP实现这一点?使用SFTP递归列出所有文件会更容易吗

我可以通过手动输入每个目录,然后重做一个msld()来实现

这是正确的解决方案。FTP协议并没有更好的标准方法来检索递归列表。因此没有优化的空间(只有通过并行化操作)。另见

一些FTP服务器支持非标准的
-R
开关和一些文件列表命令(不确定
MLSD
)。因此,如果您愿意依赖非标准功能,并且您的特定服务器支持它,那么您可以通过这种方式优化代码。另见


对于SFTP,请参见,因为
LIST-R
NLST-R
MLSD-R
不适用于我,我遵循@MartinPrikryl的建议,下面是一个FTP解决方案:

import ftplib, time
def list_recursive(ftp, remotedir):
    ftp.cwd(remotedir)
    for entry in ftp.mlsd():
        if entry[1]['type'] == 'dir':
            remotepath = remotedir + "/" + entry[0]
            print(time.time() - t0, remotepath)
            list_recursive(ftp, remotepath)
        else:
            print(entry)
ftp = ftplib.FTP()
ftp.connect("192.168.1.18", port=2240)
ftp.login()
t0 = time.time()
list_recursive(ftp, '/sdcard/music')
约900个文件夹中的约20k个文件花费了344秒(我的FTP服务器在手机上:cx File Explorer应用程序)


作为比较,以下是SFTP的解决方案:

import pysftp
def list_recursive(sftp, remotedir):
    for entry in sftp.listdir_attr(remotedir):
        remotepath = remotedir + "/" + entry.filename
        if sftp.isdir(remotepath):
            print(remotepath)            
            list_recursive(sftp, remotepath)
        else:
            print(entry.st_size, entry.st_mtime, entry.filename)
cnopts = pysftp.CnOpts()  # for local testing
cnopts.hostkeys = None 
with pysftp.Connection('192.168.1.18', port=2222, username='ssh', password='', cnopts=cnopts) as sftp:
    list_recursive(sftp, 'music')

900个文件夹中的20k个文件(我在Android手机上使用了SSH/SFTP服务器应用程序)耗时222秒。

+1–尽管有一个强制性警告:不要设置
cnopts.hostkeys=None
,除非你不关心安全性。看见