12

我有一个使用的配置文件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",","))
4

3 回答 3

13

ConfigParser_read()方法的文档字符串说:

延续由嵌入的换行符表示,然后是前导空格。

或者(正如 Python 3 中的版本所说):

值可以跨越多行,只要它们的缩进比值的第一行更深。

此功能提供了一种将值拆分并跨多行“继续”它们的方法。例如,假设您有一个名为的配置文件'test.ini',其中包含:

[EG SECTION]<br>
EG=<br>
  item 1<br>
  item 2<br>
  item 3<br>

您可以使用如下代码将 中的值读EGEG 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']
于 2012-07-09T18:45:19.943 回答
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)

请注意,我实际上是在评估那条线,如果在野外使用可能会导致安全漏洞。

于 2012-07-09T17:03:49.760 回答
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 将被视为没有值的新选项项目 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']

于 2021-07-09T07:25:18.430 回答