使用Python的ftputil单次FTP请求获文件元数据,如何获取含年份的完整日期?
问题:ftputil单次FTP请求获取含年份的完整文件修改日期
我正在开发一个对性能有较高要求的项目,需要通过单次FTP请求分析FTP文件夹及其子文件夹的内容(避免逐个文件调用ftp_host.stat(file_path)),需获取每个文件/文件夹的以下信息:
- 文件/文件夹名称及类型(区分文件与目录)
- 文件大小
- 文件最后修改日期
目前使用Python的ftputil库,受框架限制无法使用download_if_newer()方法。尝试调用:
ftp_host._dir(folder)
返回内容示例:
-rw-r--r-- 1 test ftpusers 37 Aug 13 09:37 fruits.csv
从返回内容中能提取到文件类型、大小和名称,但日期仅包含Aug 13 09:37,缺少年份,请问有没有办法获取包含年份的完整修改日期?
可行解决方案
1. 强制FTP服务器返回完整日期格式
大部分FTP服务器支持通过修改LIST命令参数,强制返回包含年份的完整时间戳。直接给_dir方法传入自定义参数即可:
# 使用"-lt"参数强制显示含年份的完整日期 ftp_host._dir(folder, "-lt")
返回内容会类似:
-rw-r--r-- 1 test ftpusers 37 2024-08-13 09:37 fruits.csv
不同服务器参数可能有差异,可尝试-lT(返回ISO格式完整时间)等参数适配。
2. 批量预加载stat缓存提升性能
如果服务器不支持修改LIST格式,可通过ftputil的stat_cache批量加载目录元数据,比逐个调用stat效率高很多:
# 预加载整个目录树的stat缓存 ftp_host.stat_cache.update_tree(folder) # 遍历目录时直接从缓存取数据 for root, dirs, files in ftp_host.walk(folder): for name in files + dirs: path = ftp_host.path.join(root, name) stat_result = ftp_host.stat(path) # 获取含年份的完整时间戳并转换为可读格式 from datetime import datetime full_modify_time = datetime.fromtimestamp(stat_result.st_mtime) print(name, stat_result.st_size, full_modify_time)
3. 使用MLSD命令获取结构化完整数据
若FTP服务器支持MLSD命令(现代服务器基本都支持),调用_mlsd方法可直接拿到含完整年份的结构化数据,且递归遍历性能优异:
for entry in ftp_host._mlsd(folder, recursive=True): name, attrs = entry # 文件类型:'file'或'dir' file_type = attrs['type'] # 文件大小:仅文件存在该字段 file_size = attrs.get('size') # 完整修改日期:格式为YYYYMMDDHHMMSS full_modify_str = attrs['modify'] # 转换为可读格式 from datetime import datetime full_modify_time = datetime.strptime(full_modify_str, "%Y%m%d%H%M%S") print(name, file_type, file_size, full_modify_time)
内容的提问来源于stack exchange,提问作者Samuel Dauzon
相关产品推荐
相关产品推荐

