python - 遍历FTP目录中的所有文件夹
问题描述
我在网上找到了一些代码,并将其修改为列出 FTP 目录中的所有文件夹。我列出了所有文件夹,代码如下。
import ftplib
from ftplib import FTP
ftp = FTP()
import datetime
filenames = []
data = []
ftp = ftplib.FTP('ftp.something.com', 'u_name', 'pswd')
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
allfiles = []
all_dirs = get_all_dirs_ftp()
使用上面的代码,我确认层次结构是正确的。现在,我试图遍历这个文件夹和子文件夹列表,并深入到每个文件夹中的文件。这就是问题发生的地方。这是我的其余代码。
for dir in all_dirs:
ftp.cwd(dir)
ftp.retrlines('LIST')
filenames = []
ftp.retrlines('NLST', filenames.append)
# writes file name and modified date and file size, to dataframe
#data = []
for filename in filenames:
filename
modifiedTimeFtp = datetime.datetime.strptime(datetime[4:], "%Y%m%d%H%M%S").strftime("%d %b %Y %H:%M:%S")
size = ftp.size(filename)
filesize = "{:.2f}".format(size/(1024)) + 'kb'
finaldata = (str(filename) + '|' + str(modifiedTimeFtp) + '|' + str(filesize))
allfiles.append(finaldata,'\n')
现在,当我运行这部分代码时,我得到了这个错误:TypeError: 'module' object is not subscriptable
我认为问题出在这个范围内。
ftp.cwd(dir)
ftp.retrlines('LIST')
filenames = []
ftp.retrlines('NLST', filenames.append)
这是我的猜测,但我不确定。有没有一种简单的方法可以让这个工作?我几乎觉得这是不可能完成的任务,因为我正在查询的 FTP 文件夹非常庞大,而且我猜测在任务运行时可能会出现各种超时或其他情况。我要做的就是获取文件名、文件修改日期/时间和文件大小。谢谢你的目光。
解决方案
这是最终的工作版本。
import ftplib
from ftplib import FTP
ftp = FTP()
from datetime import datetime
filenames = []
data = []
ftp = ftplib.FTP('ftp.anything.com', 'u_name', 'ps_wd')
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
#allfiles = []
# get parent and child folders in directory
all_dirs = get_all_dirs_ftp()
# create a list to append metadata
dir_list = []
for dir in all_dirs:
ftp.cwd('/'+dir+'/')
print(dir)
dir_list.append(dir)
ftp.dir(dir_list.append)
len(dir_list)
# you probably want to dump the results to a file...
outF = open('C:/your_path/filenames.csv', 'w')
for line in dir_list:
# write line to output file
outF.write(line)
outF.write("\n")
outF.close()
print('Done!!')
推荐阅读
- sql-server - 通过 JDBC 驱动程序连接到 SQL Server 的 SSL 握手验证错误
- swagger - Swashbuckle.AspNetCore - AWS Lambda - XML 文档
- c++ - Vulkan:缓冲区复制期间设备丢失
- c - timespec_get 的源代码在哪里?
- tsql - Tsql跨多行设置字符串变量
- html - 如何使用 VBA 从 Web 下载表格?
- javascript - 网站联系表(网站吸盘网站)
- javascript - Firebase 仅分离同一路径上的一个侦听器
- r - 如何从 Windows 命令提示符中删除 xml 文件中的注释?
- marklogic - 从 MarkLogic 下载二进制文件