2015-01-29 8 views
3

RawConfigParser을 사용하여 ini 스타일 구성 파일을 읽고 업데이트합니다. 이것은 표준 구성에서 문제없이 작동합니다. 제 문제는 동일한 스크립트에서 다른 설정 파일을 읽는 것입니다. 너무 자세하게 설명하지 않고 두 번째 설정 파일을 읽을 때 그 값은 첫 번째 ini 파일과 병합됩니다. 모두 INI 파일python RawConfigParser

infile_1.ini 
[section] 
option = Original value 
extraoption = not in ini file 2 

inifile_2.ini 
[section] 
option = Original value 

원래 내용이 내가 INI 파일의 내용을 변경하는 데 사용하는 코드입니다. 그것은이 코드가 바란대로 변경 한 INI 파일의 내용을 실행 한 후 문제를

import ConfigParser 

class status_file: 
    myConfig = ConfigParser.RawConfigParser() 
    myConfig.optionxform = str 

    def __init__(self, str_statusfile): 
     self.myConfig.read(str_statusfile) 
     self.statusfile = str_statusfile 

    def option(self, new_value): 
     self.myConfig.set("section","option",new_value) 
     with open(self.statusfile, "w") as ini_out: 
      self.myConfig.write(ini_out) 


statusfiles = ['inifile_1.ini', 'inifile_2.ini'] 
for myStatus in statusfiles: 
    myConfig = status_file(myStatus) 
    myConfig.option("Something new") 

를 재현하는 코드의 짧은 조각입니다. 그러나 두 번째 ini 파일에서 첫 번째 ini 파일의 옵션이 병합됩니다.

infile_1.ini 
[section] 
option = Something New 
extraoption = not in ini file 2 

inifile_2.ini 
[section] 
option = Something New 
extraoption = not in ini file 2 

ConfigParser 콘텐츠 또는 다른 해결책을 다시 설정할 수있는 방법이 있습니까? ConfigParser 개체의 구성 및 해체와 관련이 있습니다. 클래스없이 시도한 후 문제가 없습니다. 저는 파이썬에서 초보자입니다. 그래서 이것을 처리하는 가장 좋은 방법이 아닐 수도 있습니다. 실제 응용 프로그램은 응용 프로그램 사용 중에 ini 파일의 수와 위치가 변경된다는 점에서 동적입니다. INI 파일 목록 os.listdir(folder)

답변

1

당신이 만들고있다 혼란 내장되어이 같은 ConfigParser를 정의하는 것입니다 :

class status_file: 
    myConfig = ConfigParser.RawConfigParser() 
    myConfig.optionxform = str 

    def __init__(self, str_statusfile): 
     ... 

을 만드는 것은 myConfigstatus_file, 달리 말하자면, 자바에 대한 클래스 속성을 속성 . 따라서 두 번째 파일을 구문 분석 할 때 동일한 구성이 구문을 분석하고 옵션을 병합 한 후 구문 분석을 먼저 수행합니다. 파이썬 버전 2.x를 사용하는 경우 보조 노트로

class status_file(object): 

    def __init__(self, str_statusfile): 
     self.myConfig = ConfigParser.RawConfigParser() 
     self.myConfig.optionxform = str 
     ... 

, 당신의 클래스에서 상속해야 문제를 방지하려면

, 그냥 __init__ 방법 내부 인스턴스 속성과 파서를 만들 object. 그렇지 않으면 오래된 스타일 (pre-python2.2) 클래스가 생겨서 미묘한 문제가 발생할 수 있습니다.

+0

어 ... 우리는 거의 같은 시간에 거의 같은 일을 게시했습니다. P 또한 이전/새로운 스타일 클래스 문제를 언급하는 것을 잊었 기 때문에 내 업보트를 얻었습니다. –

+0

감사합니다 얘들 아,이 테 솔루션과 더 많은 통찰력을 줘. 이런 식으로 내 코드를 변경하고 매력처럼 작동합니다. –

1

이것은 초보자를위한 일반적인 파이썬 실수입니다. Java 또는 C++과 같은 언어를 알고 있다고 가정합니다. 그렇습니까?

클래스에서 myConfig은 클래스의 속성이지 인스턴스가 아닙니다. 기본 파이썬 동작은 인스턴스 속성을 먼저 찾은 다음 클래스 속성을 조사하므로 self.myConfig은 두 인스턴스에서 정확히 동일한 구문 분석기입니다. 자세한 내용은 this을 참조하십시오.

해결책은 클래스 선언 대신 생성자 (__init__)에 파서를 만들고 구성하는 것입니다.이 같은 것을 쓸 때 :

def foo(x): 
    return 2*x 
A = type("A", (B, C), {"foo": foo}) 
del foo 

이 수

class A(B, C): 
    def foo(x): 
     return 2*x 

그것을가 단지 구문 설탕입니다 MyConfig를 클래스의 속성이 아닌 인스턴스 속성 이유는 당신이 이해하는 데 도움이 될 수 있습니다

새로운 클래스를 동적으로 생성해야하는 경우 편리하게 사용하십시오. A이 클래스이기 때문에 __call__ 메서드는 결국 __class__ 속성과 동일한 객체 A을 공유 할 새 인스턴스를 생성하는 __new____init__ 메서드를 호출합니다. (이 단순화는 내부에서 일어나는 모든 것이 아니며, 하지만 일반적인 Python을 사용하면 충분하다.)).