我正在使用ConfigParser模块从两个Python脚本读取/写入.conf文件。一个脚本只读取数据,而另一个脚本也可以写入.conf文件。考虑到这种情况可能会以损坏的数据结束?或者ConfigParser正在阻止这种情况?
干杯
答案 0 :(得分:1)
ConfigParser本身不知道如何打开和写入物理文件,因此无法阻止比赛。您将类似文件的对象传递给write()
,这取决于您确保您正在更改的文件以原子方式更新。在像Linux这样的POSIX系统上,这通常是通过写入临时文件并在写入完成时将其重命名为最终名称来完成的。
原子重命名要求源文件系统和目标文件位于同一文件系统上,保证这一点的简便方法是确保文件位于同一目录中。
import ConfigParser
import os
import tempfile
FILENAME = '/some/path/test.config'
config = ConfigParser.SafeConfigParser()
config.read([FILENAME])
config.add_section('foo')
with tempfile.NamedTemporaryFile(dir=os.path.dirname(FILENAME),
delete=False) as tempfile:
config.write(tempfile)
os.rename(tempfile.name, FILENAME)
这假设除了一个或多个并发读取器之外,您只有一个配置文件的并发编写器。
在Windows上进行原子替换并不是一件容易的事。参见例如Is an atomic file rename (with overwrite) possible on Windows?。与讨论相关的还有How to safely write to a file? - 根据文件系统实现(及其挂载选项),元数据更改(重命名)可能在数据持久保存到文件之前完成。