2016-09-21 7 views
0

의 파일 이름과 일치합니다. 성, 이름, 생년월일 등으로 정렬 된 CSV 파일에 약 7000 개의 이름 목록이 있습니다. 또한 약 7000 개 이상의 문서가있는 폴더가 있습니다 (등록 양식)을 작성합니다.CSV 파일의 이름이 폴더

이제 파일 이름이 csv ie의 이름과 정확하게 일치하지 않을 수 있습니다. John Doe는 csv에서 파일 이름은 John-Michael Doe 등입니다.

CSV를 통해보고 스캔 된 폴더에없는 파일 이름을 확인하는 프로그램을 작성하려면 어떻게해야합니까?

저는 프로그래밍에 초보자이며 조언을 제공해 주시면 감사하겠습니다.

+0

이 방법을 살펴 보는 한 가지 방법은 CSV에서 두 세트 (이름, 성)를 만드는 것이고, 다른 하나는 파일 이름에서 (분할 등으로) 추출하는 것입니다. 일관된 명명 규칙이 없다면 완전한 일치는 없지만 두통은 더 가벼워 야합니다. – sal

+0

프로그래밍 초보자로서이 튜토리얼은 유용 할 것입니다 : https://www.dataquest.io/폴더의 파일 이름을 읽거나, 정규식을 식별하거나, 목록과 비교하여 목록을 확인하는 "bigO"전략을 고려해야합니다. 그것을 작은 부분으로 분해하고 해킹을 계속하십시오, 행운을 비네! –

답변

0

먼저 CSV를 메모리로 읽습니다. csv module으로이 작업을 수행 할 수 있습니다. 가장 유용한 도구가 사전에 키와 파일의 첫 번째 줄에 소요 csv.DictReader,이고, 나머지 읽

import csv 
with open('/path/to/yourfile.csv', 'r') as f: 
    rows = list(csv.DictReader(f)) 

from pprint import pprint 
pprint(rows[:100]) 

창에서, 경로는 다를 것이다, 그리고 c:/some folder/some other folder/ 같은 것을 (것 백 슬래시 대신 슬래시를주의하십시오.)

파일의 처음 100 행을 표시합니다. 당신은 모든 7000 개 파일의 목록을 얻으려면

[{'Date of Birth': 'Jan 1, 1970', 'First Name': 'John', 'Last Name': 'Doe'}, 
{'Date of Birth': 'Jan 1, 1970', 'First Name': 'John', 'Last Name': 'Doe'}, 
{'Date of Birth': 'Jan 1, 1970', 'First Name': 'John', 'Last Name': 'Doe'}, 
{'Date of Birth': 'Jan 1, 1970', 'First Name': 'John', 'Last Name': 'Doe'}, 
{'Date of Birth': 'Jan 1, 1970', 'First Name': 'John', 'Last Name': 'Doe'}, 
{'Date of Birth': 'Jan 1, 1970', 'First Name': 'John', 'Last Name': 'Doe'}, 
{'Date of Birth': 'Jan 1, 1970', 'First Name': 'John', 'Last Name': 'Doe'}, 
{'Date of Birth': 'Jan 1, 1970', 'First Name': 'John', 'Last Name': 'Doe'}, 
{'Date of Birth': 'Jan 1, 1970', 'First Name': 'John', 'Last Name': 'Doe'}, 
{'Date of Birth': 'Jan 1, 1970', 'First Name': 'John', 'Last Name': 'Doe'} 
...] 

다음 os.listdir를 사용 : 같은 예를 들어 당신이라는 이름의 열이있는 경우 "이름은", "성", "생년월일은"이 보일 것이다 :

import os 
images_directory = '/path/to/images/' 
image_paths = [ 
    os.path.join(images_directory, filename) 
    for filename in os.listdir(images_directory)] 

이제 파일에서 이름을 추출 할 방법이 필요합니다. 이것은 파일이 구성되는 방식에 결정적으로 달려 있습니다. 이 작업을 위해 까다 롭지 만 사용하기에 매우 강력한 도구는 정규 표현식이라고하지만, 간단할만한 것이 있습니다. 예를 들어, 파일이 "처음 이름 마지막 name.pdf"와 같은 이름을 지정하는 경우, 당신은 같은 간단한 분석 방법을 쓸 수있다 : 정확한 구현이 파일의 이름을 지정하는 방법에 따라 달라집니다

def parse_filename(filename): 
    name, extension = filename.split('.') 
    first_name, last_name = name.split(' ') 
    return first_name.replace('-', ' '), last_name.replace('-', ' ') 

을하지만, 처음 시작할 때 가장 중요한 사항은 str.split, str.strip 등이며 같은 클래스에있는 몇 가지 다른 것들입니다. re module for handling regular expressions을 살펴볼 수도 있습니다. 제가 말했듯이, 그것은 더 진보 된/강력한 기술이므로, 지금 당장 걱정할 가치가 없을 수도 있습니다.

name_to_filename = {parse_filename(filename.lower()): filename for filename in filenames} 
matched_rows = [] 
unmatched_files = [] 
for row in rows: 
    name_key = (row['First Name'].lower(), row['Last Name'].lower()) 
    matching_file = name_to_filename.get(name_key) # This sees if we have a matching file name, and returns 
                # None otherwise. 
    new_row = row.copy() 
    if matching_file: 
     new_row['File'] = matching_file 
     print('Matched "%s" to %s' % (' '.join(name_key), matching_file)) 
    else: 
     new_row['File'] = '' 
     print('No match for "%s"' % (' '.join(name_key))) 
    matched_rows.append(new_row) 
with open('/path/to/output.csv', 'w') as f: 
    writer = csv.DictWriter(f, ['First Name', 'Last Name', 'Date of Birth', 'File]) 
    writer.writeheader() 
    writer.writerows(matched_rows) 

이것은 당신이 자동으로 일치하고, 나머지 것들 빈과 일치 수있는 어떤 행이 출력 스프레드 시트를 제공한다 : 일치 할

간단한 알고리즘은 다음과 같은 것이다. 데이터가 얼마나 깨끗한 지에 따라 남은 몇 개의 항목을 손으로 일치시킬 수 있습니다. 단지 7000 가지가 있으며 "벙어리"휴리스틱 스가 아마도 대부분을 잡을 것입니다. 좀 더 진보 된 경험적 방법이 필요하면 이름에 "words"의 Jaccard similarity을, 대략적인 문자열 매칭을 위해서는 difflib 모듈을 볼 수 있습니다.

물론이 코드의 대부분은 이 아닙니다. 문제의 코드는이지만, 시작하기에 충분합니다.