【问题标题】:configparser reading and writingconfigparser读写
【发布时间】:2011-09-25 14:46:32
【问题描述】:

我正在使用 Python 3.2 和 configparser 模块,但遇到了一些问题。我需要阅读,然后写入配置文件。我尝试了以下方法:

导入配置解析器
数据 = open('data.txt', 'r+')
a = configparser.ConfigParser()
a.read_file(数据)
a['example']['test'] = 'red'
a.写(数据)

问题是当我用 r+ 打开数据时,当我写入数据时,新信息会被附加;它不会覆盖旧的。

导入配置解析器
数据=打开('data.txt','r')
a = configparser.ConfigParser()
a.read_file(数据)
a['example']['test'] = 'red'
数据=打开('data.txt','w')
a.写(数据)

这种方式 ^ 似乎不安全,因为用 w 打开它会清空文件。如果程序还没来得及写就崩溃了怎么办?配置文件丢失。用w打开前备份是唯一的办法吗?

编辑:

以下也是一种可能,但是安全吗?

a.write(open('data.txt','w'))

【问题讨论】:

    标签: python configparser read-write


    【解决方案1】:

    如果你真的很担心,你可以写入一个临时文件,然后将临时文件重命名为这个文件——如果配置写入失败,原始文件将保持不变;重命名/移动通常是原子的(尽管在 Windows 下您可能需要直接调用 MoveFileEx,而不是使用 os.rename),因此您可以确定您将拥有旧内容或新内容,以及文件不会处于任何其他状态(当然,没有底层文件系统的任何严重故障)。

    # ...
    a['example']['test'] = 'red'
    
    import tempfile, os
    with tempfile.NamedTemporaryFile() as tmp:
        a.write(tmp)
    
        # or ctypes.windll.kernel32.MoveFileExW(tmp.name, 'data.txt', 2)
        # 2 = MOVEFILE_REPLACE_EXISTING 
        # I'll leave wrapping it in a cross-platform manner up to you
        os.rename(tmp.name, 'data.txt')
    

    【讨论】:

    • 谢谢!好主意啊。可惜 Windows 使用了另一个操作。
    • 我认为应该是tempfile.mkstemp()[-1]tempfile.mktemp() 但第二个不安全...
    【解决方案2】:

    当我遇到类似情况时,我会这样做。

    import configparser
    data = open('data.txt', 'r+')
    a = configparser.ConfigParser()
    a.read_file(data)
    a['example']['test'] = 'red'
    data.truncate(0)#<--
    data.seek(0)#<--
    a.write(data)
    

    这会导致文件对象被截断为零。然后它将指针重置为文件的开头。之后,configparser 可以像往常一样处理空文件对象。

    需要注意的是,我是在 Python 3 中完成的。

    【讨论】:

      猜你喜欢
      • 2013-10-21
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      相关资源
      最近更新 更多