我第一次使用Python FTP lib。我的目标只是连接到FTP站点,获取目录列表,然后下载比特定日期更新的所有文件 - (例如,下载在过去5天内创建或修改的所有文件)
由于一些原因,这比我预期的要复杂一些。首先,我发现没有真正的“标准”FTP文件列表格式。大多数FTP站点通常使用UNIX ls
格式,但这不能保证。
所以,我最初的想法是简单地解析UNIX ls
格式:它毕竟不是那么糟糕,似乎大多数主流FTP服务器都会使用它来响应LIST
命令。 / p>
这很容易使用Python的ftplib进行编码:
import ftplib
def callback(line):
print(line)
ftp = ftplib.FTP("ftp.example.com")
result = ftp.login(user = "myusername", passwd = "XXXXXXXX")
dirlist = ftp.retrlines("LIST", callback )
这是有效的,但问题是我正在处理的FTP服务器返回的UNIX列表格式中给出的日期没有一年。典型的条目是:
-rw-rw-r-- 1 user user 1505581 Dec 9 21:53 somefile.txt
所以这里的问题是,如果日期是指当前年份,我必须编写额外的逻辑来进行“猜测”。除了真的,我宁愿不编写一些复杂的逻辑代码,当它看起来如此不必要时 - 没有理由说FTP服务器不能给我一年。
好的,所以在谷歌搜索了一些获取LIST
信息的替代方法后,我发现很多FTP服务器都支持MLST
和MLSD
命令,这显然提供了一个目录以“机器可读”格式列出,即更适合自动处理的列表格式。大。所以,我尝试以下方法:
dirlist = ftp.sendcmd("MLST")
print(dirlist)
这会产生单行响应,为我提供有关当前工作目录的数据,但不提供文件列表。
250-Start of list for /
modify=20151210094445;perm=flcdmpe;type=cdir;unique=808U6EC0051;UNIX.group=1003;UNIX.mode=0775;UNIX.owner=1229; /
250 End of list
因此,这看起来很棒,易于解析,并且还有一年的修改日期。除了MLST
命令似乎显示有关目录本身的信息,而不是文件列表。
所以,我用Google搜索并阅读了relevant RFCs,但似乎无法弄清楚如何以“MLST”格式获取文件列表。似乎MLSD
命令是我想要的,但是当我尝试时出现425
错误:
File "temp8.py", line 8, in <module>
dirlist = ftp.sendcmd("MLSD")
File "/usr/lib/python3.2/ftplib.py", line 255, in sendcmd
return self.getresp()
File "/usr/lib/python3.2/ftplib.py", line 227, in getresp
raise error_temp(resp)
ftplib.error_temp: 425 Unable to build data connection: Invalid argument
那么如何在此处以MLST
/ MLSD
格式获取完整的目录列表?
答案 0 :(得分:0)
还有另一个基于ftplib构建的模块ftputil,它有许多模拟os,os.path,shutil的功能。我发现它很容易使用并且在相关操作中很强大。也许你可以尝试一下。
至于你的目的,引言代码完全解决了它。
答案 1 :(得分:0)
您可以尝试一下,看看是否可以满足需要。
print(ftp.mlst('directory'))
我正在做类似的事情,我需要解析目录和其中所有子目录的内容。但是,我正在使用的服务器不允许使用mlst命令,因此我完成了所需的工作,
test = pd.Series('ftp.nlst('/target directory/'))
df_server_content = pd.DataFrame()
for i in test:
data_dir = '/target directory/' + i
server_series = pd.Series(ftp.nlst(data_dir))
df_server_content = df_server_content.append(server_series)