我有一个使用configParser
的配置文件:
<br>
[ section one ]<br>
one = Y,Z,X <br><br>
[EG 2]<br>
ias = X,Y,Z<br>
我的程序可以很好地阅读和处理这些值。
然而,有些部分会非常大。我需要一个配置文件,允许值在一个新行上,如下所示:
[EG SECTION]<br>
EG=<br>
item 1 <br>
item 2 <br>
item 3<br>
etc...
在我的代码中,我有一个简单的函数,它使用string.split()
显示现在设置为逗号的值的分隔符(或分隔符)。我已经尝试了\n
的转义字符串,但它不起作用。
有没有人知道这是否可以使用python的配置解析器?
http://docs.python.org/library/configparser.html
# We need to extract data from the config
def getFromConfig(currentTeam, section, value, delimeter):
cp = ConfigParser.ConfigParser()
fileName = getFileName(currentTeam)
cp.read(fileName)
try:
returnedString = cp.get(section, value)
except: # The config file could be corrupted
print( "Error reading " + fileName + " configuration file." )
sys.exit(1) #Stop us from crashing later
if delimeter != "": # We may not need to split
returnedList = returnedString.split(delimeter)
return returnedList
我会用它:
taskStrings = list(getFromConfig(teamName, "Y","Z",","))
答案 0 :(得分:11)
ConfigParser _read()
方法的docstring说:
Continuations由嵌入的换行符表示,然后是空格。
或者(正如Python 3中的版本所说):
值可以跨越多行,只要它们比值的第一行缩进更深。
此功能提供了一种分割值并在多行中“继续”它们的方法。例如,假设您有一个名为'test.ini'
的配置文件,其中包含:
[EG SECTION]<br>
EG=<br>
item 1<br>
item 2<br>
item 3<br>
您可以将EG
中EG SECTION
的值读入列表,其代码如下:
try:
import ConfigParser as configparser
except ImportError: # Python 3
import configparser
cp = configparser.ConfigParser()
cp.read('test.ini')
eg = cp.get('EG SECTION', 'EG')
print(repr(eg)) # -> '\nitem 1\nitem 2\nitem 3'
cleaned = [item for item in eg.strip().split('\n')]
print(cleaned) # -> ['item 1', 'item 2', 'item 3']
答案 1 :(得分:2)
似乎有可能。例如,在我自己的配置文件中,我有一个带有元组的列表对象:
[root]
path: /
redirectlist: [ ( r'^magic', '/file' ),
( r'^avplay', '/file' ),
( r'^IPTV', '/file' ),
( r'^box', '/file' ),
( r'^QAM', '/qam' ),
( r'.*opentv.*', '/qam' ),
( r'.+', '/file' ) ]
我做了:
redirectstr = _configdict.get('root', 'redirectlist')
redirects = eval(redirectstr)
请注意,我实际上正在评估该行,如果在野外使用,可能会导致安全漏洞。
答案 2 :(得分:0)
https://docs.python.org/3/library/configparser.html#supported-ini-file-structure
<块引用>值也可以跨越多行,只要它们是缩进的 比值的第一行深。取决于解析器的 模式,空行可以被视为多行值的一部分或 忽略。
[Multiline Values]
chorus: I'm a lumberjack, and I'm okay
I sleep all night and I work all day
[Section]
key = multiline
value with a gotcha
this = is still a part of the multiline value of 'key'
针对您的情况
[EG SECTION]<br>
EG=<br>
item1<br>
item2<br>
item3<br>
eg = cp.get('EG SECTION', 'EG')
print(eg)
会得到一些错误:源包含解析错误:这是“无值”错误。
项目 1 将被视为没有价值的新选项
item 2,3 相同,而 EG=
得到空白值
如果你用“allow_no_value=True”修改它们
[EG SECTION]<br>
EG=<br>
item1<br>
item2<br>
item3<br>
cp = ConfigParser.ConfigParser(allow_no_value=True)
eg = cp.get('EG SECTION', 'EG')
print(eg)
你会得到空白屏幕输出,因为 EG=
最后,添加一些缩进和拆分功能
[EG SECTION]<br>
EG=<br>
item1<br>
item2<br>
item3<br>
cp = ConfigParser.ConfigParser()
eg = cp.get('EG SECTION', 'EG').split('\n')
print(eg)
你会得到 ['item1', 'item2', 'item3']