如何解析文件列表以获取Python中的文件名?

Law*_*ton 4 python ftp scripting parsing ftplib

所以假设我使用Python的ftplib从FTP服务器检索日志文件列表.我如何解析该文件列表以获取列表中的文件名(最后一列)?请参阅上面的链接,例如输出.

Jam*_*ett 9

使用retrlines()可能不是最好的想法,因为它只是打印到控制台,所以你必须做一些棘手的事情来获得输出.一个可能更好的选择是使用nlst()方法,它返回你想要的东西:文件名列表.


e-s*_*tis 7

这个最好的答案

您可能想要使用ftp.nlst()而不是ftp.retrlines().它会给你你想要的东西.

如果你不能,请阅读以下内容:

系统管理员进程的生成器

在他现在着名的评论,发电机技术系统程序员简介中,David M. Beazley提供了大量的回忆来回答这种数据问题,包括wuick和可重用的代码.

EG:

# empty list that will receive all the log entry
log = [] 
# we pass a callback function bypass the print_line that would be called by retrlines
# we do that only because we cannot use something better than retrlines
ftp.retrlines('LIST', callback=log.append)
# we use rsplit because it more efficient in our case if we have a big file
files = (line.rsplit(None, 1)[1] for line in log)
# get you file list
files_list = list(files)
Run Code Online (Sandbox Code Playgroud)

为什么我们不立即生成列表?

好吧,这是因为这样做可以提供很大的灵活性:您可以应用任何中间生成器来过滤文件,然后再将其转换为files_list:它就像管道,添加一条线,添加一个没有过热的过程(因为它是生成器).如果你摆脱retrlines它,它仍然可以工作,甚至更好,因为你甚至不存储列表一次.

编辑:好吧,我读了另一个答案的评论,并说如果名称中有任何空格,这将不起作用.

很酷,这将说明为什么这种方法很方便.如果您想在流程中更改某些内容,只需更改一行即可.交换:

files = (line.rsplit(None, 1)[1] for line in log)
Run Code Online (Sandbox Code Playgroud)

# join split the line, get all the item from the field 8 then join them
files = (' '.join(line.split()[8:]) for line in log)
Run Code Online (Sandbox Code Playgroud)

好吧,这可能不是很明显,但对于庞大的批处理脚本,它很好:-)