如何保存配置文件/ Python文件IO

0 投票
3 回答
5206 浏览
提问于 2025-04-15 14:19

我有一段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)

3 个回答

1

看起来不错。

如果两个地方都调用了 get_lock_file,然后是 cf.set(...),最后是 save_lock_file,而且没有出现任何错误,这样应该是可以正常工作的。

不过,如果有不同的线程或者进程同时访问同一个文件,就可能会出现竞争条件,也就是数据冲突的问题:

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

结果文件里只保留了 B 的更新,而 A 的更新就没了。

另外,为了安全地写文件,别忘了使用 with 语句(Python 2.5 及以上版本),这样可以省去使用 try/finally 的麻烦(如果你不使用 with,就应该用 try/finally)。关于 ConfigParser 的文档:

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

对我来说没问题。

C:\temp>type svn.lock
[some_prop_section]
Hello=World

C:\temp>python
ActivePython 2.6.2.2 (ActiveState Software Inc.) based on
Python 2.6.2 (r262:71600, Apr 21 2009, 15:05:37) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 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()
...
>>> 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>type svn.lock
[some_prop_section]
hello = World
some_prop = some_value


C:\temp>
13

值得一提的是,使用ConfigObj来处理配置文件会简单一些。

如果你想先读取一个配置文件,然后再写回去,可以这样做:

from configobj import ConfigObj
config = ConfigObj(filename)

value = config['entry']
config['entry'] = newvalue
config.write()

撰写回答