原子文件写入。
项目描述
原子文件写入。
from atomicwrites import atomic_write
with atomic_write('foo.txt', overwrite=True) as f:
f.write('Hello world.')
# "foo.txt" doesn't exist yet.
# Now it does.
有关更多低级接口,请参阅 API文档。
使其与其他类似库区别开来的特性(见 替代方案和信用)
无竞争断言目标文件尚不存在。这可以通过 overwrite 参数进行控制。
Windows支持,但未经充分测试。MSDN资源对哪些操作是原子的描述并不明确。我基于 一个评论,该评论由 Doug Cook 提供,他似乎是一位微软员工
问题:如果现有文件和新文件都在同一个驱动器上,MoveFileEx是否是原子的?
简单的答案是“通常情况下是这样的,但在某些情况下它可能会无声地回退到非原子方法,所以不要指望它”。
MoveFileEx的实现看起来像这样:[…]
问题是如果重命名失败,你可能会得到一个CopyFile,这绝对不是原子的。
如果你真的需要原子或无,你可以尝试调用NtSetInformationFile,这是不受支持的,但更有可能原子。
简单的面向对象API,它包装了一个非常灵活的类API。
跨平台一致的错误处理。
工作原理
它使用与给定路径相同的目录中的临时文件。这确保了临时文件位于同一个文件系统上。
临时文件随后将原子性地移动到目标位置:在POSIX系统中,如果需要覆盖文件,则使用 rename,否则使用 link 和 unlink 的组合。在Windows系统中,它通过stdlib的 ctypes 使用适当的标志调用 MoveFileEx。
请注意,在使用 link 和 unlink 时,文件可能在文件系统中以两个条目存在的时间窗口:临时文件名和目标文件名。
此外,目标文件的权限可能因此而改变。在某些情况下,可以发出 chmod 而不会出现任何并发问题,但由于这并不总是如此,因此这个库不会自行执行此操作。
fsync
在POSIX系统中,fsync 在写入临时文件后(用于刷新文件内容和元数据)以及在文件移动后对父目录调用(用于刷新文件名)。
fsync 并不处理磁盘的内部缓冲区,但似乎没有标准的POSIX API可以做到这一点。在OS X上,由于这个原因,使用 fcntl 与 F_FULLFSYNC 代替 fsync。
在Windows上,使用 _commit,但没有关于磁盘内部缓冲区的保证。
替代方案和致谢
Atomicwrites 直接受到以下库的启发(并且共享了最小量的代码)
Trac项目的 实用函数,也用于 Werkzeug 和 mitsuhiko/python-atomicfile。使用 ctypes 而不是 PyWin32 的想法起源于那里。
abarnert/fatomic。Windows支持(基于 PyWin32)最初来自那里。
Atomicwrites 的其他替代方案包括
sashka/atomicfile。最初我考虑使用它,但当时它缺少我需要的许多功能(Windows支持、覆盖参数、通过子类化覆盖行为)。
在 Boltons 库集合 中有一个用于原子文件写入的类,它似乎有一个非常相似的 overwrite 参数。但它缺少Windows支持。
许可证
根据MIT许可,请参阅 LICENSE。
项目详情
atomicwrites-1.4.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11 |
|
MD5 | 9ff8e556d0b4a411d0cebbdb3fb0c70d |
|
BLAKE2b-256 | 87c653da25344e3e3a9c01095a89f16dbcda021c609ddb42dd6d7c0528236fb2 |