2016-07-28 1 views
0

하나의 디렉토리에 파일을 읽으 려합니다.파이썬에서 glob 패턴을 사용하여 디렉토리의 파일을 읽는 방법은 무엇입니까?

디렉토리에는 다음이 포함 스크립트를 실행

ABC1.csv 
ABC1_1.csv 
ABC1_2.csv 
ABC11.csv 
ABC11_1.csv 
ABC11_3.csv 
ABC11_2.csv 
ABC13_4.csv 
ABC13_1.csv 
ABC17_6.csv 
ABC17_2.csv 
ABC17_4.csv 
ABC17_8.csv 

동안 나는 몇 가지 조건에 따라 특정 파일을 읽기위한 명령 행 인수를주고 싶다 :

  1. 사용자는 ABC 오류 메시지를 제공합니다.
  2. 사용자가 ABC1을 제공하면 ABC1.csv, ABC1_1.csv 및 ABC1_2.csv 만 읽어야합니다.
  3. 사용자가 ABC11을 제공하면 ABC11.csv, ABC11_1.csv, ABC11_2.csv, ABC11_3.csv 만 읽어야합니다.
  4. 사용자가 ABC13을 제공하면 ABC13_1.csv, ABC13_4.csv 만 읽어야합니다.
  5. 사용자가 ABC17을 제공하면 ABC17_2.csv, ABC17_4.csv, ABC17_6.csv, ABC17_8.csv 만 읽어야합니다.

이 내용에 대해서는 스크립트를 만들었지 만 문제는 직면하고 있습니다.

프로그램 -

from glob import glob 
import os 
import sys 

file_pattern = '' 
files_list = list() 
arguments = {'ABC', 'PQR', 'XYZ'} 

if len(sys.argv[1:2]) is 1: 
    file_pattern = str(sys.argv[1:2]) 
else: 
    print 'run as <python test.py ABC>' 
    sys.exit(1) 
if file_pattern in arguments: 
    print '<Provide Name with some Number>' 
    sys.exit(1) 

file_pattern = file_pattern.replace('[','').replace(']','').replace('\'','') 

if file_pattern.startswith('ABC',0,3): 
    files_list = glob(os.path.join('<directory name>', str(file_pattern)+'_*.csv')) 
else: 
    print 'No Such File --> ' + str(file_pattern)+ '\t <Provide appropriate Name>' 
    sys.exit(1) 

if files_list: 
    for a_file in sorted(files_list): 
     print a_file 
     #process file 
else: 
    print 'No Such File --> ' + str(file_pattern)+ '\t <Provide appropriate Name>' 
    sys.exit(1) 

이 코드는 잘 작동하지만, 제 2 조건을 만족하지 않습니다. 사용자가 ABC1을 인수, 즉 python test.py ABC1로 제공하면 ABC1_1.csv, ABC1_2.csv 파일이 반환되지만 ABC1.csv 파일은 반환되지 않습니다.

다른 조건을 잃지 않고이 두 번째 조건을 어떻게 충족시킬 수 있습니까?

+1

내가 말하고 싶지만 그 전화처럼 test.py ABC1은 예상대로 ABC11.csv가 아니라 ABC1 _ *. csv를 반환합니다. 그러나 질문 텍스트와 달리 ABC1.csv를 반환하지 않습니다. 예제 코드의 버전이 질문에 맞습니까? –

+0

@Jesper Freesbug- 예 오른쪽 ... (_)을 제거하면 ABC1.csv, ABC11.csv, ABC11_1.csv 및 ABC1로 시작하는 모든 항목이 반환됩니다. 그러나 내가 원하는 것은 명확하게 문제에 대해 설명해주십시오. 가지고 있다면 제안하십시오. – kit

답변

0

나는 해결책이있다. 완벽하지 않습니다. 폴더에 다른 파일이 있다면 달라집니다.

file_pattern = 'ABC1' 
files_list = glob(os.path.join('<directory name>', str(file_pattern)+'[!0-9]*')) 
# output: ABC1.csv, ABC1_1.csv, ABC1_2.csv 

file_pattern = 'ABC11' 
files_list = glob(os.path.join('<directory name>', str(file_pattern)+'[!0-9]*')) 
# output: ['.\\ABC11.csv', '.\\ABC11_1.csv', '.\\ABC11_2.csv', '.\\ABC11_3.csv'] 

나는 Jesper와 동일한 문제가있었습니다. 문제는 *가 어떤 문자와도 일치하지만 문자가 필요하다는 것입니다.

파일 패턴 다음에 숫자가없는 파일을 선택하면 1-11 문제가 발생하지 않습니다.

+0

@ dodell- 예 올바르지 않습니다. 모든 조건을 충족시키고 싶습니다. – kit

+0

@ dodell- 올바른 해결책을 찾았습니다. 내 대답을 참조하십시오. – kit

1

다른 시나리오를 시도하고 마침내 모든 조건을 만족시키는 정확한 솔루션을 얻었습니다. 먼저 사용자 입력 파일이 사용 가능한지 아닌지, 지정된 디렉토리에서 사용 가능한지 확인합니다. 사용 가능하다면 동일한 파일로 모든 파일을 동일한 목록의 끝에 첨부 파일 끝에 추가합니다 (_).

지정한 디렉토리에서 파일을 사용할 수 없다면 사용자 입력을하고 (_) 기호가있는 파일을 확인한 다음 모든 파일을 목록으로 변환합니다. 결국 목록을 반복하고 최종 결과를 얻습니다.

프로그램 -

from glob import glob 
import os 
import sys 

file_pattern = '' 
files_list = list() 

arguments = {'ABC', 'PQR', 'XYZ'} 

#checking for user provided argument or not 
if len(sys.argv[1:2]) is 1: 
    file_pattern = str(sys.argv[1:2]) 
else: 
    print 'run as < python test.py <LineName> >' 
    sys.exit(1) 
#replace all unnecessary stuff with ('') 
file_pattern = file_pattern.replace('[','').replace(']','').replace('\'','') 

#checking for line number is provided or not 
if file_pattern in arguments: 
    print '<Provide LineName with some Number>' 
    sys.exit(1) 

flag = True 
#list of all files containing specified directory 
files = os.listdir('<directory name>') 

for file_name in files: 
    if str(file_name) == str(file_pattern)+'.csv': 
     files_list = glob(os.path.join('<directory name>', str(file_pattern)+'_*.csv')) 
     #appending match file also to resultant list 
     files_list.append('<directory name>'+file_name) 
     flag = False 
#if specified file is not present in dir check for filename with (_) 
if flag: 
    files_list = glob(os.path.join('<directory name>', str(file_pattern)+'_*.csv')) 

#checking for list contains items or not 
if files_list: 
    for a_file in sorted(files_list): 
     print a_file 
else: 
    print 'No Such File --> ' + str(file_pattern)+ '\t <Provide appropriate Name1>' 
    sys.exit(1) 

디렉토리가 ABC1.csv, ABC1_1.csv, ABC1_2.csv, ABC11.csv, ABC11_1.csv, ABC11_3.csv, ABC11_2.csv 파일이 들어보십시오.

출력 시나리오 :

#if input is ABC1 
.\\ABC1.csv 
.\\ABC1_1.csv 
.\\ABC1_2.csv 
#if input is ABC11 
.\\ABC11.csv 
.\\ABC11_1.csv 
.\\ABC11_2.csv 
.\\ABC11_3.csv 
0

당신은 추가 "특별한"사건에 대한 간단한 검사를 추가 할 수 있습니다, 이런 일이 :

if file_pattern.startswith('ABC',0,3): 
    csv_path = os.path.join('.', str(file_pattern)) 
    files_list = glob(csv_path + '_*.csv') 
    # Just check the special case that's not included in the glob above 
    csv_path = csv_path + '.csv' 
    if os.path.isfile(csv_path): 
     files_list.append(csv_path) 
else: 
    print 'No Such File --> ' + str(file_pattern)+ '\t <Provide appropriate Name>' 
    sys.exit(1) 
+0

예 예. 그것은 또한 잘 작동합니다. – kit