如何使用Python ftplib获取FTP文件的修改时间

27

我正在尝试使用Python将CSV文件加载到Amazon S3。我需要知道CSV文件的修改时间。我正在使用ftplib在Python(2.7)中连接FTP。

2个回答

48

MLST或MDTM

使用MLSTMDTM命令可以在FTP上检索单个文件的时间戳,但是ftplib不支持这两个命令。

当然,您可以使用FTP.voidcmd自己实现MLSTMDTM

有关详细信息,请参见RFC 3659,特别是:

MDTM的一个简单示例:

from ftplib import FTP
from dateutil import parser

# ... (connection to FTP)

timestamp = ftp.voidcmd("MDTM /remote/path/file.txt")[4:].strip()

time = parser.parse(timestamp)

print(time)

MLSD

MLSD是ftplib库中唯一明确支持返回标准化文件时间戳的命令,可以通过FTP.mlsd方法使用。尽管只有在您想要检索多个文件的时间戳时才有意义。

  • 使用MLSD检索完整的目录列表
  • 从返回的集合中搜索您想要的文件
  • 检索modify fact
  • 按照规范解析它,YYYYMMDDHHMMSS[.sss]

有关详细信息,请再次参考RFC 3659:

from ftplib import FTP
from dateutil import parser

# ... (connection to FTP)

files = ftp.mlsd("/remote/path")

for file in files:
    name = file[0]
    timestamp = file[1]['modify']
    time = parser.parse(timestamp)
    print(name + ' - ' + str(time))

请注意,MLSTMLSDMDTM返回的时间是UTC时间(除非服务器出现故障)。因此,您可能需要根据本地时区对其进行更正。

请参考RFC 3659第2.3节

时间值始终用UTC(GMT)表示,并使用公历表示,而不管在服务器PI位置指示的日期和时间使用了哪个日历。


LIST

如果FTP服务器不支持MLSTMLSDMDTM中的任何一个,那么您只能使用已过时的LIST命令。这涉及解析其返回的专有列表。

通常*nix的列表如下:

-rw-r--r-- 1 user group           4467 Mar 27  2018 file1.zip
-rw-r--r-- 1 user group         124529 Jun 18 15:31 file2.zip

有了这样的列表,这段代码就能实现:

from ftplib import FTP
from dateutil import parser

# ... (connection to FTP)

lines = []
ftp.dir("/remote/path", lines.append)

for line in lines:
    tokens = line.split(maxsplit = 9)
    name = tokens[8]
    time_str = tokens[5] + " " + tokens[6] + " " + tokens[7]
    time = parser.parse(time_str)
    print(name + ' - ' + str(time))

查找最新的文件

另请参见Python FTP按日期获取最新文件


-4

当我想要更改文件修改时间时,我会在控制台上使用FTP客户端。登录到远程FTP ftp ftp.dic.com

  • cd 命令进入正确的目录
  • SITE 命令以扩展命令模式移动
  • UTIME somefile.txt 20050101123000 20050101123000 20050101123000 UTC

更改访问时间、修改时间,这是在2005年1月1日12:30:00创建目录的时间 somefile.txt

完整示例:

site UTIME somefile.txt 20150331122000 20150331122000 20150331122000 UTC

请放心享受愉快的时间旅行之旅 :)


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