2016-08-10 2 views
0

파이썬에서 .INI 파일을 읽는 스크립트를 코딩했습니다. configparser라는 라이브러리가 있다는 것을 압니다.하지만 .INI는 "표준"과 약간 다릅니다. 일반적으로Python에서 비 전통적인 INI 읽기

, 파일이 같아야합니다

[HEADER] 
username john 
fruits oranges apples 

이 아니면을 할 수있는 쉬운 방법이 있나요 :

[HEADER] 
username = john 
fruits = oranges, apples 

하지만 내 경우, 나는 그런 일을 읽을 필요 내 파서를 만들어야하니?

- 수정 -

여러분, 답변 해 주셔서 감사합니다. 나는 아주 중요한 것을 언급하는 것을 잊어 버렸다. INI 파일 (독점적이고 고통스러운 소프트웨어에 의해 생성 됨)에는 동일한 키가있는 여러 줄을 가질 수 있습니다. 내가 너에게 모범을 보이겠다.

[HEADER] 
day1 bananas oranges 
day1 apples avocado 
day2 bananas apples 
+4

의 표준 구문 분석과 같은 구문 분석 하드 - 매개 변수 이름 중 어느 것도 공백을 포함하지 않는 한'line.split ('')'과 같은 것을 사용할 수 있습니다. –

+0

파싱하기 전에 ini를 정규 ini 파일로 변환하십시오 :'newline = line.split ('') [0] + "="+ ",".join (line.split ('') [1 :]' – handle

+1

예제는 단순 해 보이지만 포맷에 숨어있는 복잡성이있을 수 있습니다. 동일한 헤더가 두 번 나타나면 추가 또는 겹쳐 쓰습니까? 대체 변수를 허용합니까? 주석을 달 수 있고이를 나타 내기 위해 사용할 수 있습니까? 여러 값을 가질 수 있습니까? 그리고 어떻게 표현합니까? Confiig 구문 분석은 어두운 예술입니다. – tdelaney

답변

0

이것은 개인 파서를 처리해야하는 것과 같습니다. 나는 여전히 그것을 ConfigParser 객체에 넣을 것이지만, 앞으로는 더 쉽게 사용할 수있을 것이다. configparser.ConfigParser은 할 수있는 일은 거의입니다. 나는 당신이 당신의 질문의 끝 부분에서 언급으로 config["SomeHeader"]["foo"] == ["bar", "baz"]

[SomeHeader] 
foo = bar 
foo = baz 

을 치료하기 위해 그것을 말할 수있는 방법을 잘 모르는 것 같아요. 이 것

def is_section_header(text): 
    # what makes a section header? To me it's a word enclosed by 
    # square brackets. 
    match = re.match(r"\[([^\]]+)\]", text) 
    if match: 
     return match.group(1) 

def get_option_value_tuple(line): 
    """Returns a tuple of (option, comma-separated values as a string)""" 
    option, *values = line.split(" ") 
    return (option, ", ".join(values)) 

def parse(filename): 
    config = configparser.ConfigParser() 
    cursection = None 
    with open(filename) as inifile: 
     for line in inifile: 
      sectionheader = is_section_header(line) 
      if sectionheader: 
       cursection = sectionheader 
       try: 
        config.add_section(sectionheader) 
       except configparser.DuplicateSectionError: 
        # This section already exists! 
        # how should you handle this? 
        continue # ignore for now 
      else: 
       option, values = get_option_value_tuple(line.strip()) 
       if config.has_option(cursection, option): 
        config[cursection][option] += (", " + values) 
       else: 
        config[cursection][option] = values 
    return config 

:

당신은 뭔가를 시도 할 수

[SomeHeader] 
foo bar baz 
foo spam eggs 
bar baz 

이 수동으로도 너무없는 구문 분석

[SomeHeader] 
foo = bar, baz, spam, eggs 
bar = baz 
+1

답장을 보내 주셔서 감사합니다. 아담 감사합니다. 작동하는 코드는 기대하지 않았지만, 프로그래밍 초보자이기 때문에 정말 도움이 될 것입니다. –