当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何解析文件列表以获取Python中的文件名?》经验,为你挑选了2个好方法。

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



1> James Bennet..:

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



2> e-satis..:

这个最好的答案

您可能想要使用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)

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

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有