将源ini文件的子集写入目标ini文件

时间:2014-08-14 06:41:57

标签: python configparser

我有source.ini如下

[section1]
name = 'xyz'
place = 'abc'

[section2]
....
....

[section3]
....
....

我想阅读source.ini并将只有部分列表的内容复制到新的ini文件中。这是我的代码在做必要的事情......

import ConfigParser

Config = ConfigParser.RawConfigParser()
Config.read('source.ini')
sections = ['section1', 'section2']

outputConfig = ConfigParser.RawConfigParser()

with open('destination.ini', 'wb') as fp:
    for each_section in sections:
        fp.write('\n\n['+each_section+']\n')
        for (each_key, each_val) in Config.items(each_section):
            fp.write(each_key+':'+each_val+'\n')

        outputConfig.write(fp)

我按需要获得输出。我的问题是我是以正确的方式做到的吗?有更优雅的方式吗?

2 个答案:

答案 0 :(得分:1)

是的,你的代码不够优雅。它将输出文件写入两次。首先,手工:

fp.write(each_key+':'+each_val+'\n')

,其次,在RawConfigParser对象的帮助下:

outputConfig.write(fp)

只有手动写入才有效。对outputConfig.write()的调用是无操作。

我们应该消除创建输出文件的两种方法之一,但是哪一种?我声称应该删除手动方法,因为您的程序不需要非常了解.INI文件格式。

另外,我发现你使用each_来表示循环变量令人不安。也许这只是个人偏好。

以下是我将如何修复它:

import ConfigParser

Config = ConfigParser.RawConfigParser()
Config.read('source.ini')
sections = ['section1', 'section2']

outputConfig = ConfigParser.RawConfigParser()

for section in sections:
    outputConfig.add_section(section)
    for key, val in Config.items(section):
        outputConfig.set(section, key, val)


with open('destination.ini', 'w') as fp:
    outputConfig.write(fp)

答案 1 :(得分:1)

与Rob的答案无关,您的方法可能还有其他一些问题。首先,您使用RawConfigParser。它在Python 2.x下是正确的,但是对于3.x,它被认为是遗留的,并且建议使用ConfigParser

但是恕我直言,主要的问题是configparser模块会删除你文件中的任何评论,如果你有一些并想保留它们。以下是使用正则表达式的变体,如果它们位于文件的开头或有效的[section]之后会保留注释:

import re

sections = ['section1', 'section2']
rxsect = re.compile('^\s*\[\s*(\w+)\s*\]')
with open('source.init') as fin, open('destination.ini', 'w') as fout:
    copy = True
    for line in fin:
        m = rxsect.match(line)
        if m:
            copy = m.group(1) in sections
        if copy:
            n = fout.write(line)

当然,如果评论不是问题,Rob的答案会更好,因为文件会被解析并且会检测到语法错误,而我认为该文件在语法上是正确的。