有没有一种方法可以有效地产生包含数百万个文件的目录中的每个文件?
我知道os.listdir
,但是据我所知,这会将目录中的所有文件名存入内存,然后返回列表。我想要的是一种产生文件名,对其进行处理,然后产生下一个文件名的方法,而无需将它们全部读入内存。
有什么办法吗?我担心使用这种方法更改文件名,添加新文件并删除文件的情况。一些迭代器阻止您在迭代过程中修改集合,实质上是通过在开始时对集合状态进行快照,并在每个move
操作上比较该状态来进行。如果有一个迭代器能够从路径生成文件名,那么如果文件系统发生了更改(添加,删除,重命名了迭代目录中的文件)并会修改集合,是否会引发错误?
可能有几种情况可能导致迭代器失败,而这完全取决于迭代器如何维护状态。使用S.Lotts示例:
filea.txt
fileb.txt
filec.txt
迭代器的产量filea.txt
。期间processing
,filea.txt
被重命名为filey.txt
,fileb.txt
并被重命名为filez.txt
。当迭代器尝试获取下一个文件时,如果要使用文件名filea.txt
来查找其当前位置以查找下一个文件,而该文件filea.txt
不存在,那么会发生什么呢?它可能无法恢复其在集合中的位置。同样,如果迭代器在yieldfileb.txt
时要获取filea.txt
,则它可能会查找的位置fileb.txt
,失败并产生错误。
如果迭代器能够以某种方式维护索引dir.get_file(0)
,则保持位置状态不会受到影响,但是某些文件可能会丢失,因为它们的索引可能会移动到迭代器“后”的索引中。
当然,所有这些都是理论上的,因为似乎没有内置的(python)方式可以遍历目录中的文件。但是,下面有一些很好的答案可以通过使用队列和通知来解决问题。
编辑:
值得关注的操作系统是Redhat。我的用例是这样的:
进程A不断将文件写入存储位置。进程B(我正在编写的进程)将遍历这些文件,基于文件名进行一些处理,然后将文件移动到另一个位置。
编辑:
有效的定义:
形容词1.有充分根据或正当理由。
(抱歉,S.Lott,我无法抗拒)。
我已经编辑了上面讨论的段落。