2012-12-24 2 views
4

파일을 사용하고 있는데 경로가 포함 된 DIR이라는 섹션이 하나 있습니다. EX는 :INI 파일 - 파이썬에서 쓰는 동안 공백을 제거하는 방법

[DIR] 
DirTo=D:\Ashish\Jab Tak hai Jaan 
DirBackup = D:\Parser\ERICSSON_CSCORE_STANDARD_VMS\Backup 
ErrorDir = D:\Parser\ERICSSON_CSCORE_STANDARD_VMS\Error 

CombinerDir = D:\Parser\ERICSSON_CSCORE_STANDARD_VMS\Combiner 
DirFrom=D:\Parser\ERICSSON_CSCORE_STANDARD_VMS\In 
PidFileDIR = D:\Parser\ERICSSON_CSCORE_STANDARD_VMS\Pid 
LogDir = D:\Parser\ERICSSON_CSCORE_STANDARD_VMS\Log 
TempDir = D:\Parser\ERICSSON_CSCORE_STANDARD_VMS\Temp 

지금 내가 그것을했을 경로를 바꾸려하지만 교체 할 때 그 후 새로 작성 .ini 파일의 구분 전에 나에게 공간을 제공합니다. 예 : DirTo = D:\Parser\Backup. 이 공간을 어떻게 제거합니까?

코드 : 당신이 볼 수 있듯이

def write(self, fp): 
    """Write an .ini-format representation of the configuration state.""" 
    if self._defaults: 
     fp.write("[%s]\n" % DEFAULTSECT) 
     for (key, value) in self._defaults.items(): 
      fp.write("%s = %s\n" % (key, str(value).replace('\n', '\n\t'))) 
     fp.write("\n") 
    for section in self._sections: 
     fp.write("[%s]\n" % section) 
     for (key, value) in self._sections[section].items(): 
      if key != "__name__": 
       fp.write("%s = %s\n" % 
         (key, str(value).replace('\n', '\n\t'))) 
     fp.write("\n") 

에서, %s = %s\n 포맷은 하드 코딩 된 함수에 있습니다 : 여기

def changeINIfile(): 
    config=ConfigParser.RawConfigParser(allow_no_value=False) 
    config.optionxform=lambda option: option 
    cfgfile=open(r"D:\Parser\ERICSSON_CSCORE_STANDARD_VMS\Windows\opx_PAR_GEN_660_ERICSSON_CSCORE_STANDARD_PM_VMS_MALAYSIA.ini","w") 
    config.set('DIR','DirTo','D:\Ashish\Jab Tak hai Jaan') 
    config.optionxform=str 
    config.write(cfgfile) 
    cfgfile.close() 
+1

이 텍스트 줄을 쓰는 데 사용하는 코드를 게시하십시오. Martijn Pieters는'strip()'을 사용하여 문자열의 시작과 끝에서 공백을 제거 할 수 있다고 제안하지만 코드 샘플은 디버깅에 도움이 될 것입니다. –

+0

질문을 편집하여 코드로 업데이트하십시오. –

+0

[원시 문자열] (http://docs.python.org/2/reference/lexical_analysis.html#literals)을 사용하거나 \를 두 번 이스케이프하거나 경로에'os.path.join'을 사용하십시오. 또한 파이썬 코드가 여분의 공백을 만들지는 않으므로 정확히 무엇이 여러분의 질문입니까? –

답변

0

RawConfigParser.write의 정의입니다. 나는 당신의 옵션이 생각 :와

  1. 은 등호
  2. 덮어 쓰기 RawConfigParserwrite 방법 주위에 공백으로 INI 파일을 사용하여 자신의
  3. , 파일을 읽을 파일을 쓰기 공백을 제거하고 쓰기 그것은 다시

당신은 확실히 옵션 1을 사용할 수없는 100 %, 여기에 옵션 3 할 수있는 방법의 경우 :

def remove_whitespace_from_assignments(): 
    separator = "=" 
    config_path = "config.ini" 
    lines = file(config_path).readlines() 
    fp = open(config_path, "w") 
    for line in lines: 
     line = line.strip() 
     if not line.startswith("#") and separator in line: 
      assignment = line.split(separator, 1) 
      assignment = map(str.strip, assignment) 
      fp.write("%s%s%s\n" % (assignment[0], separator, assignment[1])) 
     else: 
      fp.write(line + "\n") 
+0

안녕 Slace .. 옙 3 솔루션은 나를 위해 일했다 ..고맙습니다. :) –

+2

파이썬 3에서는'config.write (file_on_disk, space_around_delimiters = False)'를 사용할 수 있습니다. [Python 3 Documentation : configparser.write] (http://docs.python.org/3/library/configparser.html#configparser.ConfigParser.write) –

8

이 문제가 발생하여 추가 해결책이 생겼습니다.

  • 이후 버전의 Python에서는 RawConfigParser의 내부 함수 구조가 변경 될 수 있으므로이 함수를 바꾸지 않았습니다.
  • 나는 또한 내가 단순히 "="와 "="를 대체하는 파일 객체의 래퍼를 작성하는 대신

낭비 같았다 때문에이 기록 된 후 다시 우측에서 파일을 읽고 싶어하지 않았다 모든 줄이 그것으로 쓰여졌다.

class EqualsSpaceRemover: 
    output_file = None 
    def __init__(self, new_output_file): 
     self.output_file = new_output_file 

    def write(self, what): 
     self.output_file.write(what.replace(" = ", "=", 1)) 

config.write(EqualsSpaceRemover(cfgfile)) 
+0

가장 우아하고 유연한 솔루션을 참조하십시오. 쓰기 기능을 쉽게 확장하여 다른 종류의 필터링을 수행 할 수 있습니다. – MarcH

+1

write.replace ("=", "=", 1)를 사용하여 "="이있는 값을 변경하지 마십시오. – linuts

+0

Ok, @linuts 최대 교체 횟수를 추가하는 답을 편집했습니다. 1. 이것이 문제를 야기 할 수있는 유일한 방법은 키에 같음이 있지만 키가 일반적으로 데이터보다 적다는 것입니다. – Joshua