- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我知道 os.listdir
,但据我所知,它将目录中的所有文件名放入内存,然后返回列表。我想要的是一种生成文件名、对其进行处理,然后生成下一个文件名的方法,而无需将它们全部读入内存。
有什么办法吗?我担心使用这种方法更改文件名、添加新文件和删除文件的情况。一些迭代器阻止您在迭代期间修改集合,主要是通过在开始时拍摄集合状态的快照,并在每次 move
操作时比较该状态。如果有一个能够从路径产生文件名的迭代器,如果有修改集合的文件系统更改(添加、删除、重命名迭代目录中的文件),它是否会引发错误?
在某些情况下可能会导致迭代器失败,这完全取决于迭代器如何维护状态。使用 S.Lotts 示例:
filea.txt
fileb.txt
filec.txt
迭代器生成 filea.txt
。在 processing
期间,filea.txt
重命名为 filey.txt
,fileb.txt
重命名为 文件z.txt
。当迭代器尝试获取下一个文件时,如果它使用文件名 filea.txt
找到它的当前位置以便找到下一个文件和 filea.txt
不存在,会发生什么?它可能无法恢复它在集合中的位置。类似地,如果迭代器在生成 filea.txt
时要获取 fileb.txt
,它可能会查找 fileb.txt
的位置,失败,并产生错误。
如果迭代器能够以某种方式维护索引 dir.get_file(0)
,那么维护位置状态将不会受到影响,但一些文件可能会丢失,因为它们的索引可能会被移动到迭代器“后面”的索引。
当然这都是理论上的,因为似乎没有内置(python)方法来迭代目录中的文件。但是,下面有一些很好的答案,它们通过使用队列和通知来解决问题。
编辑:
关注的操作系统是 Redhat。我的用例是这样的:
进程 A 不断地将文件写入存储位置。进程 B(我正在编写的进程)将迭代这些文件,根据文件名进行一些处理,并将文件移动到另一个位置。
编辑:
有效的定义:
形容词1. 有根据或有根据,中肯。
(对不起,S.Lott,我无法抗拒)。
我已经编辑了上面有问题的段落。
最佳答案
tl;dr
os.scandir
正如我之前所写的那样,由于“iglob”只是一个真正的迭代器的外观,您必须调用低级系统函数才能像您想要的那样一次获得一个。幸运的是,可以从 Python 调用低级函数。Windows 和 Posix/Linux 系统的底层函数不同。
win32api
是否有任何调用来读取“目录中的下一个条目”或如何继续。关于 C 函数的文档在这里: http://www.gnu.org/s/libc/manual/html_node/Opening-a-Directory.html#Opening-a-Directory
我提供了一段 Python 代码,演示了如何在我的系统 上调用低级 C 函数,但这段代码可能不适用于您的系统[footnote-1]。我建议打开你的 /usr/include/dirent.h
头文件并验证 Python 片段是否正确(你的 Python Structure
必须匹配 C struct
) 在使用代码段之前。
这是使用 ctypes
和 libc
我放在一起的片段,它允许您获取每个文件名,并对其执行操作。请注意,当您对结构上定义的 char 数组执行 str(...)
时,ctypes
会自动为您提供一个 Python 字符串。 (我使用的是 print
语句,它隐式调用了 Python 的 str
)
#!/usr/bin/env python2
from ctypes import *
libc = cdll.LoadLibrary( "libc.so.6")
dir_ = c_voidp( libc.opendir("/home/jsbueno"))
class Dirent(Structure):
_fields_ = [("d_ino", c_voidp),
("off_t", c_int64),
("d_reclen", c_ushort),
("d_type", c_ubyte),
("d_name", c_char * 2048)
]
while True:
p = libc.readdir64(dir_)
if not p:
break
entry = Dirent.from_address( p)
print entry.d_name
更新:Python 3.5 现在处于测试阶段 - 在 Python 3.5 中,新的 os.scandir
函数调用可作为 PEP 471 的具体化使用。 (“更好更快的目录迭代器”)它完全按照这里的要求进行操作,此外还有许多其他优化可以比 os.listdir
下的大型目录列表提供高达 9 倍的速度提升Windows(在 Posix 系统中增加 2-3 倍)。
[footnote-1] dirent64
C struct
是在每个系统的 C 编译时确定的。
关于python - 有没有一种方法可以有效地生成包含数百万个文件的目录中的每个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5090418/
我收到未知数据,我想以编程方式查看相关性,并将所有完全相关的变量组合在一起(忽略方向)。在下面的数据集中,我可以手动查看相关性并说 a, f, g, h一起去吧b, d, e .我怎样才能以编程方
这个问题在这里已经有了答案: use dplyr's summarise_each to return one row per function? (3 个答案) 关闭 4 年前。 作为探索性工作的
我想要完成的是使用数组存储未知大小的多项式。我在互联网上看到的是使用一个数组,每个单元格都包含系数,度数是单元格编号,但这不是有效的,因为如果我们有一个多项式,如:6x^14+x+5。这意味着我们将从
嘿伙计们,我一直在尝试解析 HTML 文件以从中抓取文本,但时不时地,我会得到一些非常奇怪的字符,例如 à€œ。我确定是“智能引号”或弯头标点符号导致了我的所有问题,因此我的临时修复是搜索所有这些字符
我原来的 data.table 由三列组成。 site、observation_number 和 id。 例如以下是 id = z 的所有观察结果 |site|observation_number|i
"Premature optimisation is the root of all evil (but it's nice to have once you have an ugly solutio
给定这个数组 X: [1 2 3 2 3 1 4 5 7 1] 和行长度数组R: [3 2 5] 表示转换后每行的长度。 我正在寻找一个计算效率高的函数来将 X reshape 为数组 Y: [[ 1
我有一些 data.frame s: # Sample data a <- data.frame(c(1:10), c(11:20)) names(a) <- c("A", "B") b <- dat
我有点困惑。列表擅长任意位置插入,但不善于随机访问? (怎么可能)如果你不能随机访问,你怎么知道在哪里插入? 同样,如果你可以在任何位置插入,为什么你不能从那个位置高效地读取? 最佳答案 如果您已经有
我有一个向量,我想计算它的移动平均值(使用宽度为 5 的窗口)。 例如,如果有问题的向量是[1,2,3,4,5,6,7,8],那么 结果向量的第一个条目应该是 [1,2,3,4,5] 中所有条目的总和
有一个随机整数生成器,它生成随机整数并在后台运行。需求设计一个API,调用时返回当时的簇数。 簇:簇是连续整数的字典顺序。例如,在这种情况下,10,7,1,2,8,5,9 簇是 3 (1,2--5--
我想做的是将一组 (n) 项分成大小相等的组(大小为 m 的组,并且为简单起见,假设没有剩余,即 n 可以被 m 整除)。这样做多次,我想确保同一组中的任何项目都不会出现两次。 为了使这稍微更具体一些
假设我有一些包含类型排列的模板表达式,在本例中它们来自 Abstract Syntax Tree : template
我已经在这方面工作了几天,似乎没有我需要的答案。 由于担心这个被标记为重复,我将解释为什么其他问题对我不起作用。 使用 DIFFLIB for Python 的任何答案都无助于我的需求。 (我在下面描
我正在使用 NumPy 数组。 我有一个 2N 长度向量 D,并希望将其一部分 reshape 为 N x N 数组 C. 现在这段代码可以满足我的要求,但对于较大的 N 来说是一个瓶颈: ``` i
我有一个问题: 让我们考虑这样的 pandas 数据框: Width Height Bitmap 67 56 59 71 61 73 ...
我目前正在用 C 语言编写一个解析器,设计它时我需要的东西之一是一个可变字符串“类”(一组对表示实例的不透明结构进行操作的函数),我将其称为 my_string。 string 类的实例只不过是包装
假设我在 --pandas-- 数据框中有以下列: x 1 589 2 354 3 692 4 474 5 739 6 731 7 259 8 723
我有一个成员函数,它接受另一个对象的常量引用参数。我想 const_cast 这个参数以便在成员函数中轻松使用它。为此,以下哪个代码更好?: void AClass::AMember(const BC
我们目前正在将 Guava 用于其不可变集合,但我惊讶地发现他们的 map 没有方法可以轻松创建只需稍作修改的新 map 。最重要的是,他们的构建器不允许为键分配新值或删除键。 因此,如果我只想修改一
我是一名优秀的程序员,十分优秀!