You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:23:15