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

6 投票
8 回答
12940 浏览
提问于 2025-04-11 18:15

假设我正在使用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()这个方法,它会直接给你想要的结果:一个文件名的列表。

撰写回答