我有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)
我按需要获得输出。我的问题是我是以正确的方式做到的吗?有更优雅的方式吗?
答案 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的答案会更好,因为文件会被解析并且会检测到语法错误,而我认为该文件在语法上是正确的。