我是Python的新手,尝试从FTP列出所有子目录中的所有文件。 FTP通常采用这种格式。
A
B
C
子目录:
AA
BB
CC
我可以使用 ftp.nlist()
列出目录 ['A', 'B', 'C']
。我希望我的输出为 ['AA','BB','CC']
。我尝试了很多方法并查找了很多资料来寻找解决方案/提示。
我是Python的新手,尝试从FTP列出所有子目录中的所有文件。 FTP通常采用这种格式。
A
B
C
子目录:
AA
BB
CC
我可以使用 ftp.nlist()
列出目录 ['A', 'B', 'C']
。我希望我的输出为 ['AA','BB','CC']
。我尝试了很多方法并查找了很多资料来寻找解决方案/提示。
我知道这可能有点过时,但是如果这里有一个答案,就可以节省我一些精力,所以在这里给出我的答案。我是一个业余爱好者,所以这可能不是最有效的方法,但是这是我编写的一个程序,用于获取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)
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)