2012-09-08 1 views
3

간단한 도구를 내 awk/sed 요구 사항에 대한 고급 도구로 작성했습니다. 스크립트에서 쿼리 파일의 한 열에있는 값을 기준으로 두 파일을 비교 한 다음 마스터 파일에서 전체 항목을 추출합니다. 스크립트를 사용하면 각 파일의 열과 구분 기호에 대한 값을 입력 할 수 있습니다.python3의 파서는 argparse를 통해 명령 줄에서 구분 기호 값을 가져 오지 않습니다.

문제는 '구분 기호'옵션이 명령 줄에서 제공 될 때 스크립트에 의해 인식되지 않는다는 것입니다. 여기

은 (부분) 내 코드입니다 : 그래서 당신이 볼, 나는 명령 줄에서 '쿼리 파일'구분에 대한 옵션을 가지고 argparse를 통해 스크립트에서 사용할

##- - - - - - - -- - - - - - Arguments - - - - - - - - - - - - - -## 
parser = argparse.ArgumentParser() 

## Command line options 
parser.add_argument("-m", "--master",  dest="master", help="master file") 
parser.add_argument("-q", "--query",  dest="query", help="queries to be extracted") 
parser.add_argument("-d", "--delimiter", dest="delimiter", default='\t', help="delimiter in master") 
parser.add_argument("-p", "--position", dest="position", default='1', help="position/column of value in master") 
parser.add_argument("-d2", "--delimiter2", dest="delimiter2", default='\t', help="delimiter in query") 
parser.add_argument("-p2", "--position2", dest="position2", default='1', help="position/column of value in query") 

args = parser.parse_args() 

def Extractor(master, query): 

    out_file = ('%s_matched_%s' % (query,master)) 
    fh_out = open(out_file, 'w') 

    query_set =() ## To unique query set 
    for i in query: 
     key = i.split('args.delimiter2')[int(args.position2)] ## Key is the value on which matching will be done 
     query_set.add(key) 

,하지만 않습니다 작동하지. 내가 명시 적으로 같은 스크립트의 구분 기호를 언급 경우에만 작동합니다

key = i.split('\t')[args.position2] ## Key is the value on which matching will be done 

내가주는 명령 행 옵션은 다음과 같습니다

  • ABC.csv 마스터 파일입니다

    $ py3 ExtractHeaders_v01.py -m ABC.csv -q XYZ.list -d2 \t -d , -p 1 -p2 0 
    

    어떤에서 항목을 추출합니다.

    • 번째 열 가 매칭에 사용한다 (-p 1)
    • 그 구분은 쉼표 (-d ,)
  • XYZ.list 쿼리 파일이다.
    • 첫 번째 열 가 일치에 사용됩니다 (-p2 0)
    • 그 구분은

로부터 주어 졌을 때 나를 구분 기호가 스크립트에 의해 사용되지 않는 이유를 이해 도와주세요 탭 (-d2 \t)입니다 명령 행

답변

1

: 그럼 당신은 파이썬이 문자열을 언 이스케이프해야합니다 즉, 유형 "Ctrl+VTab".

+1

'$ '\ t'' 문자열을 사용할 수도 있습니다.'$'\ t''는'readline'이 활성화되어 있는지 여부에 상관없이'bash'에서 작동합니다. – chepner

+0

더 나은 옵션입니다. 알아 둘만한! –

+0

@Chepner : Perfecto ... 감사합니다. – Bade

2

쉘이 명령 행에서 \t을 해석 중이며 파이썬으로 전달되는 것은 대체로 t입니다. \\t 또는 '\t'을 시도하여 argv에 리터럴 2 문자 이스케이프 시퀀스를 가져옵니다. 또한 따옴표 (단일 또는 이중) 동봉 Tab 다음 Ctrl+V을 눌러 * 괜찬아 쉘 (예 : bash는)에 Tab 문자를 전달할 수 있습니다

delimiter = delimiter.decode("string-escape") 
+0

이것은 정확한 해결책처럼 보이지만 위의 스크립트에서 "delimiter = delimiter.decode ("string-escape ")를 어디에 넣어야하는지 알려주실 수 있습니까? – Bade

+0

이것은 내가 시도한 것이다. args.delimiter = args.delimiter.decode (" ''") args.delimiter2 = args.delimiter2.decode (" ''") ...하지만 오류가 발생했다 : args.delimiter = args .delimiter.NameError : 'args'name이 정의되지 않았습니다. – Bade

관련 문제