使用Python列出FTP中所有子目录中的文件

6

我是Python的新手,尝试从FTP列出所有子目录中的所有文件。 FTP通常采用这种格式。

 A
 B
 C

子目录:

 AA
 BB
 CC

我可以使用 ftp.nlist() 列出目录 ['A', 'B', 'C']。我希望我的输出为 ['AA','BB','CC']。我尝试了很多方法并查找了很多资料来寻找解决方案/提示。


1
你可以使用FTP.retrlines() - https://docs.python.org/2/library/ftplib.html#ftplib.FTP.retrlines - shaktimaan
1
@shaktimaan 谢谢。但那只是类似于ftp.dir的东西,它只列出目录。我想要子目录的列表。 - abn
2个回答

4

我知道这可能有点过时,但是如果这里有一个答案,就可以节省我一些精力,所以在这里给出我的答案。我是一个业余爱好者,所以这可能不是最有效的方法,但是这是我编写的一个程序,用于获取FTP服务器上的所有目录。它将列出无论目录嵌套到多深的层级中,都能找到所有目录。

from ftplib import FTP

def get_dirs_ftp(folder=""):
    contents = ftp.nlst(folder)
    folders = []
    for item in contents:
        if "." not in item:
            folders.append(item)
    return folders

def get_all_dirs_ftp(folder=""):
    dirs = []
    new_dirs = []

    new_dirs = get_dirs_ftp(folder)

    while len(new_dirs) > 0:
        for dir in new_dirs:
            dirs.append(dir)

        old_dirs = new_dirs[:]
        new_dirs = []
        for dir in old_dirs:
            for new_dir in get_dirs_ftp(dir):
                new_dirs.append(new_dir)

    dirs.sort()
    return dirs


host ="your host"
user = "user"
password = "password"

print("Connecting to {}".format(host))
ftp = FTP(host)
ftp.login(user, password)
print("Connected to {}".format(host))

print("Getting directory listing from {}".format(host))
all_dirs = get_all_dirs_ftp()
print("***PRINTING ALL DIRECTORIES***")
for dir in all_dirs:
    print(dir)

上面的代码非常慢,有没有更好的解决方案来获取所有子目录? - wawawa

1
我给 Ed Kern 写了一个类似的解决方案,但是使用了 "mlsd" 命令。由于 Ed Kern 的代码会导致没有文件名扩展名的文件出错,使用 mlsd 可以避免这个错误。请注意,非常老的 FTP 服务器可能没有 mlsd 命令。
from ftplib import FTP

def get_items_mlsd(folder):
    filedatas = []
    for file_data in ftp.mlsd(folder):
        filedatas.append(file_data)
    return filedatas

def get_all_dirs_ftp(folder=""):
    items = []
    new_items = []

    new_items = get_items_mlsd(folder)

    while len(new_items) > 0:
        old_dirs = new_items
        new_items = []
        for file_data in old_dirs:
            file_name, meta = file_data
            file_type = meta.get("type")
            if file_type != "dir":
                items.append(file_name)
            else:
                news = get_items_mlsd(file_name)
                for new in news:
                    file_name1 , meta = new
                    file_type = meta.get("type")
                    if file_type == "dir":
                        new = list(new)
                        directory = new[0]
                        new[0] = file_name + "/" + directory
                        new = tuple(new)
                        new_items.append(new)
                    else:
                        file_name1 = file_name + "/" + file_name1
                        items.append(file_name1)
    items.sort()
    return items

host = "host"
user = "user_name"
password = "pw"

print("Connecting to {}".format(host))
ftp = FTP(host)
ftp.login(user, password)
print("Connected to {}".format(host))
print("Getting file listing from {}".format(host))

all_items = get_all_dirs_ftp()

print("***PRINTING ALL ITEMS***")
with open('ftp_files.txt', 'w') as f:
    for dir in all_items:
        print(dir)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接