所以假设我使用Python的ftplib从FTP服务器检索日志文件列表.我如何解析该文件列表以获取列表中的文件名(最后一列)?请参阅上面的链接,例如输出.
使用retrlines()可能不是最好的想法,因为它只是打印到控制台,所以你必须做一些棘手的事情来获得输出.一个可能更好的选择是使用nlst()方法,它返回你想要的东西:文件名列表.
您可能想要使用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)
为什么我们不立即生成列表?
好吧,这是因为这样做可以提供很大的灵活性:您可以应用任何中间生成器来过滤文件,然后再将其转换为files_list
:它就像管道,添加一条线,添加一个没有过热的过程(因为它是生成器).如果你摆脱retrlines
它,它仍然可以工作,甚至更好,因为你甚至不存储列表一次.
编辑:好吧,我读了另一个答案的评论,并说如果名称中有任何空格,这将不起作用.
很酷,这将说明为什么这种方法很方便.如果您想在流程中更改某些内容,只需更改一行即可.交换:
files = (line.rsplit(None, 1)[1] for line in log)
和
# join split the line, get all the item from the field 8 then join them files = (' '.join(line.split()[8:]) for line in log)
好吧,这可能不是很明显,但对于庞大的批处理脚本,它很好:-)