【问题标题】:How to save a configuration file / python file IO如何保存配置文件/python文件IO
【发布时间】:2009-09-14 18:35:35
【问题描述】:

我有这个 python 代码用于打开一个 .cfg 文件,写入并保存它:

import ConfigParser 

    def get_lock_file():
        cf = ConfigParser.ConfigParser()
        cf.read("svn.lock")
        return cf
    def save_lock_file(configurationParser):
        cf = configurationParser
        config_file = open('svn.lock', 'w')
        cf.write(config_file)
        config_file.close()

这看起来很正常还是我错过了有关如何打开-写入-保存文件的内容?有没有更标准的方式来读写配置文件?

我问是因为我有两种方法似乎做同样的事情,它们获取配置文件句柄 ('cf') 调用 cf.set('blah', 'foo' bar) 然后使用 save_lock_file(cf)调用上面。对于一种方法它有效,而对于另一种方法,写入永远不会发生,现在不确定为什么。

def used_like_this():
        cf = get_lock_file()
        cf.set('some_prop_section', 'some_prop', 'some_value')
        save_lock_file(cf)

【问题讨论】:

    标签: python file file-io configuration-files


    【解决方案1】:

    请注意,使用 ConfigObj 处理配置文件更简单。

    读取然后写入配置文件:

    from configobj import ConfigObj
    config = ConfigObj(filename)
    
    value = config['entry']
    config['entry'] = newvalue
    config.write()
    

    【讨论】:

    • 啊,真的吗?如果我使用它,我不必担心打开和关闭文件等?
    • 否 - ConfigObj 会根据需要为您处理打开和关闭文件。
    【解决方案2】:

    我觉得不错。

    如果两个地方都调用get_lock_file,然后是cf.set(...),然后是save_lock_file,并且没有引发异常,这应该可以。

    如果您有不同的线程或进程访问同一个文件,您可能会遇到竞争条件:

    1. 线程/进程A读取文件
    2. 线程/进程 B 读取文件
    3. 线程/进程 A 更新文件
    4. 线程/进程 B 更新文件

    现在文件只包含 B 的更新,而不是 A。

    另外,为了安全的文件写入,不要忘记with 语句(Python 2.5 及更高版本),它将为您节省一次尝试/最终(如果您不使用with,则应该使用它) )。来自ConfigParser 的文档:

    with open('example.cfg', 'wb') as configfile:
      config.write(configfile)
    

    【讨论】:

      【解决方案3】:

      为我工作。

      C:\temp> 键入 svn.lock [some_prop_section] 你好=世界 C:\临时>蟒蛇 ActivePython 2.6.2.2 (ActiveState Software Inc.) 基于 Python 2.6.2 (r262:71600, Apr 21 2009, 15:05:37) [MSC v.1500 32 位 (Intel)] 开启 win32 键入“帮助”、“版权”、“信用”或“许可”以获取更多信息。 >>> 导入配置解析器 >>> def get_lock_file(): ... cf = ConfigParser.ConfigParser() ... cf.read("svn.lock") ...返回cf ... >>> def save_lock_file(configurationParser): ... cf = configurationParser ... config_file = open('svn.lock', 'w') ... cf.write(config_file) ... config_file.close() ... >>> def used_like_this(): ... cf = get_lock_file() ... cf.set('some_prop_section', 'some_prop', 'some_value') ... save_lock_file(cf) ... >>> used_like_this() >>> ^Z C:\temp> 键入 svn.lock [some_prop_section] 你好=世界 some_prop = some_value C:\温度>

      【讨论】:

      • 好吧好吧。所以我没有疯。它看起来不像我做 IO 的方式有问题,一定是其他的方法。感谢您插入此内容。我会投票,但需要 15 个代表
      猜你喜欢
      • 2016-02-28
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 2012-08-01
      相关资源
      最近更新 更多