Python FTP:可解析的目录列表

时间:2015-12-10 15:04:29

标签: python ftp

我第一次使用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服务器都支持MLSTMLSD命令,这显然提供了一个目录以“机器可读”格式列出,即更适合自动处理的列表格式。大。所以,我尝试以下方法:

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格式获取完整的目录列表?

2 个答案:

答案 0 :(得分:0)

还有另一个基于ftplib构建的模块ftputil,它有许多模拟os,os.path,shutil的功能。我发现它很容易使用并且在相关操作中很强大。也许你可以尝试一下。

至于你的目的,引言代码完全解决了它。

答案 1 :(得分:0)

您可以尝试一下,看看是否可以满足需要。

print(ftp.mlst('directory'))

我正在做类似的事情,我需要解析目录和其中所有子目录的内容。但是,我正在使用的服务器不允许使用mlst命令,因此我完成了所需的工作,

  1. 解析主目录内容
  2. for遍历主目录内容
  3. 将循环输出附加到pandas DataFrame。
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)
相关问题