【发布时间】:2014-12-26 16:38:30
【问题描述】:
我知道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 不存在,会发生什么?它可能无法恢复它在集合中的位置。同样,如果迭代器在产生filea.txt 时要获取fileb.txt,它可能会查找fileb.txt 的位置,失败并产生错误。
如果迭代器能够以某种方式维护索引dir.get_file(0),则维护位置状态不会受到影响,但可能会丢失一些文件,因为它们的索引可能会移动到迭代器“后面”的索引。
这当然都是理论上的,因为似乎没有内置 (python) 方法来迭代目录中的文件。但是,下面有一些很好的答案,它们通过使用队列和通知来解决问题。
编辑:
关注的操作系统是 Redhat。我的用例是这样的:
进程 A 不断将文件写入存储位置。 进程 B(我正在编写的那个)将遍历这些文件,根据文件名进行一些处理,并将文件移动到另一个位置。
编辑:
有效定义:
形容词 1. 有充分根据或正当的,相关的。
(抱歉 S.Lott,我无法抗拒)。
我已经编辑了上面有问题的段落。
【问题讨论】:
-
我认为没有多平台原生 pyhton 方法可以做到这一点 - 你在哪个操作系统上?
-
将一百万个文件名读入内存真的有问题吗?如今,内存使用实际上是一个问题的情况很少......
-
一百万个 100 个字符的字符串小于 100 MB 的 RAM ...
-
@Josh Smeaton:在这种情况下,像“有效”这样的广义术语是没有意义的。这个定义没有用,因为这个词太宽泛以至于没有意义。显然,在定义中使用宽泛、模糊、无用的术语是很有趣的。
-
@S.Lott,也许是一次失败的幽默尝试。我想通过像我一样编辑问题,你会意识到我同意你的观察,并试图用潜在的解决方案列举理论化的问题。也许我应该将最初的问题表述为“这些理论化问题中的任何一个在实际实现中是否存在实际问题”。