【发布时间】:2012-11-14 11:57:36
【问题描述】:
使用 Python 从目录中获取单个文件最有效和最快的方法是什么?
关于我的具体问题的更多详细信息:
我有一个包含很多预生成文件的目录,我只想随机选择一个。因为我知道除了首先列出所有文件之外没有真正有效的从目录中选择随机文件的方法,所以我的文件是用一个已经随机的名称生成的,因此它们已经是随机排序的,我只需要选择第一个文件夹中的文件。
所以我的问题是:如何从我的文件夹中选择第一个文件,而不必从目录中加载整个文件列表(也没有操作系统来执行此操作,我的最佳目标是强制操作系统只需返回一个文件,然后停止!)。
注意:我的目录中有很多文件,因此我不想列出所有文件而只选择一个。
注意2:每个文件只选择一次,然后删除以确保下次只选择新文件(从而确保某种随机性)。
解决方案
我最终选择使用一个索引文件来存储:
- 要选取的当前文件的索引(例如:1 代表 file1.ext,2 代表 file2.ext,等等)
- 最后生成的文件的索引(例如:file1999.ext 为 1999)
当然,这意味着我的文件不再使用随机名称生成,而是使用确定性可递增模式(例如:“file%s.ext”% ID)
因此,我的两个主要操作的时间几乎恒定:
- 访问文件夹中的下一个文件
- 计算剩余文件的数量(以便我可以在需要时在后台线程中生成新文件)。
这是针对我的问题的具体解决方案,更多通用解决方案,请阅读接受的答案。
您可能还对我发现的另外两个解决方案感兴趣,这些解决方案可以使用 Python 优化文件访问和目录遍历:
【问题讨论】:
-
弄清楚一次,然后建立自己的数据库以使其更快?
-
目录是不排序的。相反,它们以当前目录结构顺序(磁盘结构)列出项目,可能是创建顺序。
-
我避免使用 DBMS 是有原因的,因为我不需要任何类型的索引。我不想选择一个特定的文件,只是任何文件,而且只有一个。 @Martijn:我所说的是为了更好地传达我的想法而进行的简化。文件按 inode 排序,但这不是重点:我只想获取第一个文件,因为我的文件已经是随机的,所以我不必关心随机选择文件:只选择此目录中的任何文件都已经给我一个随机结果。
-
我什至不确定操作系统是否可以从目录中获取给定名称的文件,而不在内部列出目录中的文件。
-
POSIX具体解决方案是通过
ctypes使用opendir()/readdir()系统函数。