如何在Python中解析文件列表以获取文件名?
假设我正在使用Python的ftplib来从FTP服务器获取日志文件的列表。我该如何处理这个文件列表,只提取出文件名(最后一列),并把它们放进一个列表里呢?可以参考上面的链接查看示例输出。
8 个回答
1
有没有什么原因导致 ftplib.FTP.nlst() 对你不起作用呢?我刚刚检查了一下,它只会返回指定目录下文件的名字。
8
这个最佳答案
你可以试试用 ftp.nlst()
,而不是 ftp.retrlines()
。这样能得到你想要的结果。
如果不行,可以看看下面的内容:
系统管理员过程中的生成器
在他那篇现在很有名的文章 系统程序员的生成器技巧入门 中,David M. Beazley 提供了很多解决这类数据问题的快速且可重用的代码示例。
例如:
# 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)
好吧,这里可能不太明显,但对于大型批处理脚本来说,这种方式非常不错 :-)
9
使用retrlines()可能不是最好的选择,因为它只是把内容打印到控制台上,这样你需要做一些复杂的操作才能获取这些输出。一个更好的方法是使用nlst()这个方法,它会直接给你想要的结果:一个文件名的列表。