2009-09-14 3 views
0

저장하는 방법 :내가하는 .CFG 파일을 열고 그것을 작성과 저장이 파이썬 코드가 구성 파일/파이썬 파일 IO

import ConfigParser 

    def get_lock_file(): 
     cf = ConfigParser.ConfigParser() 
     cf.read("svn.lock") 
     return cf 
    def save_lock_file(configurationParser): 
     cf = configurationParser 
     config_file = open('svn.lock', 'w') 
     cf.write(config_file) 
     config_file.close() 

이 정상 보이는가 아니면 제가 방법에 대해 뭔가를 놓친 거지를 파일을 열어 쓰기 저장 하시겠습니까? 구성 파일을 읽고 쓰는 표준 방법이 있습니까?

같은 일을하는 두 가지 방법이 있기 때문에 config 파일 핸들 ('cf')을 호출하여 cf.set ('blah', 'foo'bar)를 호출 한 다음 save_lock_file (cf) 위의 호출. 한 가지 방법으로는 작동하고 다른 방법으로는 결코 쓰기가 일어나지 않습니다. 이유는 확실하지 않습니다.

def used_like_this(): 
     cf = get_lock_file() 
     cf.set('some_prop_section', 'some_prop', 'some_value') 
     save_lock_file(cf) 

답변

13

구성 파일 처리가 ConfigObj를 사용하면 더 간단하다는 점에 유의하십시오.

읽고 다음 설정 파일을 작성하려면 :

from configobj import ConfigObj 
config = ConfigObj(filename) 

value = config['entry'] 
config['entry'] = newvalue 
config.write() 
+0

아, 정말요? 이 파일을 사용하면 파일 열기 및 닫기에 대해 걱정할 필요가 없습니다. – Purrell

+0

문서를 읽으십시오. 내가 참조. 단. – Purrell

+0

Nope - ConfigObj는 필요에 따라 파일 열기 및 닫기를 처리합니다. – fuzzyman

1

나에게 잘 어울립니다.

두 곳에서 get_lock_file, cf.set(...)save_lock_file을 호출하고 예외가 발생하지 않는 경우이 방법이 작동합니다.

당신이 경쟁 조건이 할 수있는 동일한 파일에 액세스하는 다른 스레드 또는 프로세스가있는 경우 :

  1. 스레드/프로세스 A는
  2. 스레드/프로세스 B가 파일을 읽고 파일을 읽고을
  3. 스레드/프로세스 A는
  4. 스레드/프로세스 B는 이제 파일 만 B의 UPD를 포함

파일을 업데이트하는 파일을 업데이트 ates, A가 아닙니다.

안전한 파일 쓰기를 위해 with 문 (Python 2.5 이상)을 잊지 마십시오. 시도/마침내 저장합니다 (with을 사용하지 않는 경우 사용해야합니다). ConfigParser의 문서에서 :

with open('example.cfg', 'wb') as configfile: 
    config.write(configfile) 
+0

확인 좋은입니다. 덧붙였다. – Purrell

1

저에게 맞는 작품입니다.

 
C:\temp>type svn.lock 
[some_prop_section] 
Hello=World 

C:\temp>python 
ActivePython 2.6.2.2 (ActiveState Software Inc.) based on 
Python 2.6.2 (r262:71600, Apr 21 2009, 15:05:37) [MSC v.1500 32 bit (Intel)] on 
win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import ConfigParser 
>>> def get_lock_file(): 
...   cf = ConfigParser.ConfigParser() 
...   cf.read("svn.lock") 
...   return cf 
... 
>>> def save_lock_file(configurationParser): 
...   cf = configurationParser 
...   config_file = open('svn.lock', 'w') 
...   cf.write(config_file) 
...   config_file.close() 
... 
>>> def used_like_this(): 
...   cf = get_lock_file() 
...   cf.set('some_prop_section', 'some_prop', 'some_value') 
...   save_lock_file(cf) 
... 
>>> used_like_this() 
>>> ^Z 


C:\temp>type svn.lock 
[some_prop_section] 
hello = World 
some_prop = some_value 


C:\temp> 
+0

좋습니다. 그래서 나는 미치지 않았다. IO를하는 방식에 문제가없는 것처럼 보이고 다른 방법이되어야합니다. 이것에 연결해 주셔서 감사합니다. 나는 upvote하지만 15 rep가 필요합니다. – Purrell