2013-08-16 5 views
0

를 생략하면 특정 파일을 검색하고 argparse파이썬 argparse, 옵션은 내가 입력 파일에 대한 인수를

parser.add_argument('-al', nargs = 1, type = argparse.FileType('r'), 
        dest = 'alphabet') 

이 매개 변수는 선택 사항이지만 생략하면 나는 아직도 얻을 필요가 그것을 취급이 용이 현재 디렉토리를 검색하여이 입력 파일. 그리고 .al 확장자를 가진 파일이 두 개 이상이거나없는 경우 오류가 발생합니다. 그렇지 않으면 발견 된 파일을 엽니 다.

#if no alphabet look for .al file in current directory 
if(args.alphabet == None): 
    AlFiles = [ f for f in os.listdir('.') 
       if os.path.isfile(f) and f.endswith('.al') ] 

    #there should be one file with .al extension 
    if(len(AlFiles) != 1): 
      sys.exit('error: no alphabet file provided and ' 
        'there are more than one or no .al file in current directory, ' 
        'which leads to ambiguity') 

    args.alphabet = open(AlFiles[0], 'r') 

어쩌면 기본 또는 조치 매개 변수, argparse 이것을 수행 어쨌든입니다. 인수를 구문 분석하기 전에 검색을 수행하고 예외 상황이 발생하면 필요한 파일이 명령 줄 인수로 제공 될 수 있기 때문에 여전히 예외를 발생시킬 수 없습니다. 구문 분석기가 필요한 매개 변수를 충족시키지 못했지만 argparse를 사용하여 구문 분석기를 수행하는 방법을 찾을 수없는 경우 작업 수행을 고려했습니다.

답변

0

인수에 대한 기본 속성을 설정하여 수정할 수 있습니다.

parser = argparse.ArgumentParser() 
parser.add_argument('-al', 
        type = argparse.FileType('r'), 
        default = [ f for f in os.listdir('.') 
           if os.path.isfile(f) and f.endswith('.al')], 
        dest = 'alphabet') 

그런 다음 확인하십시오. 그런 식으로 인수가 생략되었는지 여부에 상관없이 둘 이상의 * .al 파일이 있는지 여부를 확인하는 함수가 하나만 있습니다. 지정된 문자 파일이 있다면

args = parser.parse_args() 
if isinstance(args.alphabet,types.ListType): 
    if len(args.alphabet) != 1: 
     parser.error("There must be exactly one alphabet in the directory") 
    else: 
     args.alphabet = open(args.alphabet[0]) 

이 방법 args.alphabet이 열려있는 파일을 개최한다 또는 하나 개의 알파벳 파일에 있습니다 :

이, 예를 들어, 다음과 같이 무언가에 의해 달성 될 수있다 현재 작업 디렉토리이지만, cwd에 더 많거나없는 경우 오류를 발생시킵니다.

다음 -al 인수를 생략하면 우리는 목록을 가져올 수 있기 때문에 이 argparse.FileType('r') 어떤 파일을 열 수 없습니다. 또한 nargs=1을 생략하면 -al 인수에 지정된 사용자가 하나의 열린 파일을 포함하는 목록을 생성하므로이 값을 생략해야합니다. 이 속성을 생략하면 사용자가 지정한 원시 열린 파일이 제공됩니다.

편집 :import types이어야합니다.

+0

그래서 구문 분석을 한 후 크기에 대해'args.alphabet'을 확인 했습니까? 여러 개의 파일이있는 경우 모두 열립니다? –

+0

귀하의 질문을 이해하기 때문에, 파일이 디렉토리의 유일한 * .al 파일 인 경우에만 파일을 열려고합니다. 솔루션 시도에 대한 편집을 확인하십시오. – angryfruitsalad

+0

야아 난 그냥 add_arguments에, 당신의 대답을 얻었다 유형의 모든 파일이 공개를 automaticly 이 은 적어도 당신이 다시 다시는 안'args.alphabet = 열려있는 것을 의미에 FileType입니다 (args.alphabet [0])' 그리고 만약 오류가 발생하면 여러 파일이 닫힙니다. –