2011-04-22 9 views
9

일부 입력 줄에서 필드를 구문 분석 할 Python 프로그램을 만들고 있습니다. 사용자가 명령 줄에서 옵션으로 필드 구분 기호를 입력하도록하고 싶습니다. 이 작업을 수행하려면 optparse을 사용하고 있습니다. 나는 \t과 같은 것을 입력하는 것이 내가 원하는 것보다 문자 그대로 \t에 분리된다는 문제에 직면 해있다. 나는 이것이 내가 생각할 수있는 따옴표, 백 슬래시, 그리고 t의 모든 콤보를 시도했기 때문에 이것이 파이썬이면서 껍질이 아니라는 것을 확신한다.메타 문자를 파이썬에 명령 줄에서 인수로 전달

raw_input이 아닌 인수가 일반 입력이되도록 optparse을 얻을 수 있다면 제대로 작동한다고 생각합니다. 그러나 나는 그것을 할 수있는 방법이 없습니다.

나는 또한 두 문자 "\t"에서 문자열을 하나의 문자 탭으로 바꾸기 위해 여러 가지 대체 및 정규식을 시도했지만 성공하지는 못했습니다.

field 1[tab]field\t2

(참고 : [tab]는 탭 문자이고 field\t2은 8 문자 스트링) input.txt

parseme.py :

#!/usr/bin/python 
from optparse import OptionParser 
parser = OptionParser() 
parser.add_option("-d", "--delimiter", action="store", type="string", 
    dest="delimiter", default='\t') 
parser.add_option("-f", dest="filename") 
(options, args) = parser.parse_args() 
Infile = open(options.filename, 'r') 
Line = Infile.readline() 

Fields = Line.split(options.delimiter) 
print Fields[0] 
print options.delimiter 

Infile.close() 

이것은 나를 준다 :

$ parseme.py -f input.txt 
field 1 
[tab] 

안녕하세요. 기본 설정이 올바르게 적용되었습니다. (예, 난 그냥 \ t 기본을하고 그것에 대해 잊을 수 알지만, 이러한 유형의 문제를 처리하는 방법을 알고 싶습니다.)

$ parseme.py -f input.txt -d '\t' 
field 1[tab]field 
\t 

이 내가 원하는 것이 아니다.

답변

6
>>> r'\t\n\v\r'.decode('string-escape') 
'\t\n\x0b\r' 
+0

멋진 깨끗한 해결책 – user237419

+0

고맙습니다. – Darlingtonia

0

빠른 더러운 방법은 다음과 같이 그것을 eval하는 것입니다 :

eval(options.delimiter, {}. {}) 

여분의 빈 dicts이 프로그램의 실수로 건드리지이 방지한다.자 (\ n, \ r 등)

options.delimiter = re.sub("\\\\t","\t",options.delimiter) 

당신이 더 이스케이프 문자를 일치에 대해 재를 적용 할 수

또 다른 방법은 파이썬 외부 문제를 해결하기 위해 :

0

스크립트 내에서 해결 :

당신이 쉘 스크립트를 호출

는 다음과 같이 그것을 :

parseme.py -f input.txt -d '^V<tab>' 

^V는 "Ctrl + V를 눌러 '이 제대로 파이썬 스크립트에 탭 문자를 전달합니다

다음 키 일반 탭을 눌러을 말한다 (다음, 전에 파서를 을 정의 할 수) 해당 기능을

parser.add_option("-d", "--delimiter", action="callback", type="string", 
        callback=my_callback, default='\t') 

을 :

0

callback 옵션은 까다로운 경우를 처리 할 수있는 좋은 방법입니다

def my_callback(option, opt, value, parser): 
    val = value 
    if value == '\\t': 
     val = '\t' 
    elif value == '\\n': 
     val = '\n' 
    parser.values.delimiter = val 

당신은 명령 줄을 통해 이것을 확인할 수 있습니다 : python test.py -f test.txt -d \t (\t 주위에 따옴표가 없으면 쓸모가 없습니다.).

'optparse'모듈을 통해 옵션을 처리 할 수 ​​있으며 구문 분석 결과를 사후 처리 할 필요가 없습니다.

관련 문제