일반적인 ConfigParser 생성 파일은 다음과 같습니다.
[Section]
bar=foo
[Section 2]
bar2= baz
이제 다음과 같은 목록을 색인화하는 방법이 있습니까?
[Section 3]
barList={
item1,
item2
}
관련 질문 : 섹션 당 Python의 ConfigParser 고유 키
답변
목록을 구분 된 문자열로 포장 한 다음 구성에서 문자열을 얻으면 압축을 풀지 않습니다. 이 방법으로 설정하면 구성 섹션은 다음과 같습니다.
[Section 3]
barList=item1,item2
예쁘지는 않지만 가장 간단한 목록에는 작동합니다.
답변
또한 약간 늦었지만 일부에게는 도움이 될 수 있습니다. ConfigParser와 JSON의 조합을 사용하고 있습니다.
[Foo]
fibs: [1,1,2,3,5,8,13]
그냥 읽어보십시오 :
>>> json.loads(config.get("Foo","fibs"))
[1, 1, 2, 3, 5, 8, 13]
목록이 길면 줄을 끊을 수도 있습니다 (@ peter-smit 덕분에).
[Bar]
files_to_check = [
"/path/to/file1",
"/path/to/file2",
"/path/to/another file with space in the name"
]
물론 JSON 만 사용할 수는 있지만 구성 파일이 훨씬 더 읽기 쉽고 [DEFAULT] 섹션이 매우 편리합니다.
답변
이 파티에 늦었지만 최근에는 구성 파일의 전용 섹션으로 목록을 구현했습니다.
[paths]
path1 = /some/path/
path2 = /another/path/
...
다음과 config.items( "paths" )
같이 반복 가능한 경로 항목 목록을 얻는 데 사용 합니다.
path_items = config.items( "paths" )
for key, path in path_items:
#do something with path
희망이 다른 사람들 이이 질문을 인터넷 검색하는 데 도움이되기를 바랍니다)
답변
많은 사람들이 모르는 것 중 하나는 여러 줄 구성 값이 허용된다는 것입니다. 예를 들면 다음과 같습니다.
;test.ini
[hello]
barlist =
item1
item2
값은 config.get('hello','barlist')
다음과 같습니다.
"\nitem1\nitem2"
splitlines 방법으로 쉽게 분할 할 수 있습니다 (빈 항목을 필터링하는 것을 잊지 마십시오).
피라미드와 같은 큰 프레임 워크를 살펴보면이 기술을 사용하고 있습니다.
def aslist_cronly(value):
if isinstance(value, string_types):
value = filter(None, [x.strip() for x in value.splitlines()])
return list(value)
def aslist(value, flatten=True):
""" Return a list of strings, separating the input based on newlines
and, if flatten=True (the default), also split on spaces within
each line."""
values = aslist_cronly(value)
if not flatten:
return values
result = []
for value in values:
subvalues = value.split()
result.extend(subvalues)
return result
내 자신, 나는 이것이 당신에게 공통적 인 경우 ConfigParser를 확장 할 것입니다 :
class MyConfigParser(ConfigParser):
def getlist(self,section,option):
value = self.get(section,option)
return list(filter(None, (x.strip() for x in value.splitlines())))
def getlistint(self,section,option):
return [int(x) for x in self.getlist(section,option)]
이 기술을 사용할 때주의해야 할 사항이 몇 가지 있습니다.
- 항목 인 줄 바꿈은 공백으로 시작해야합니다 (예 : 공백 또는 탭).
- 공백으로 시작하는 다음 줄은 모두 이전 항목의 일부로 간주됩니다. 또한 = 기호가 있거나;로 시작하는 경우; 공백을 따르십시오.
답변
당신이 할 경우 말 그대로 목록을 전달 당신은 사용할 수 있습니다 :
ast.literal_eval()
구성 예 :
[section]
option=["item1","item2","item3"]
코드는 다음과 같습니다
import ConfigParser
import ast
my_list = ast.literal_eval(config.get("section", "option"))
print(type(my_list))
print(my_list)
산출:
<type'list'>
["item1","item2","item3"]
답변
이 답변 중 하나 에 대한 converters
kwarg에 대한ConfigParser()
언급 은 오히려 실망 스럽습니다.
문서에 따르면 파서 및 섹션 프록시 모두 ConfigParser
에 대한 get
방법을 추가하는 사전을 전달할 수 있습니다 . 따라서 목록의 경우 :
example.ini
[Germ]
germs: a,list,of,names, and,1,2, 3,numbers
파서 예제 :
cp = ConfigParser(converters={'list': lambda x: [i.strip() for i in x.split(',')]})
cp.read('example.ini')
cp.getlist('Germ', 'germs')
['a', 'list', 'of', 'names', 'and', '1', '2', '3', 'numbers']
cp['Germ'].getlist('germs')
['a', 'list', 'of', 'names', 'and', '1', '2', '3', 'numbers']
이것은 서브 클래 싱이 필요하지 않기 때문에 개인적으로 가장 좋아하는 것으로, 최종 사용자가 JSON이나 해석 할 수있는 목록을 완벽하게 작성하기 위해 의존 할 필요가 없습니다. ast.literal_eval
.
답변
나는 이것을 소비하려고 여기에 도착했다 …
[global]
spys = richard.sorge@cccp.gov, mata.hari@deutschland.gov
대답은 쉼표로 나누고 공백을 제거하는 것입니다.
SPYS = [e.strip() for e in parser.get('global', 'spys').split(',')]
목록 결과를 얻으려면
['richard.sorge@cccp.gov', 'mata.hari@deutschland.gov']
OP의 질문에 정확하게 대답하지는 않지만 일부 사람들이 찾고있는 간단한 답변 일 수 있습니다.
