파이썬에서 파일 이름의 일부를 두 폴더 (이름) 사이의 특수 문자와 일치시킨 다음 두 번째 폴더에서 찾은 일치를 복사 할 수 있습니까?

Nov 17 2020

얼마 전에 나는 파일이 저장되는 공통 폴더에서 파일을 보내야하는 위치에 따라 다른 폴더로 파일을 분류하는 데 도움이되는 프로그램을 작성했습니다. 저는 StackOverflow에서 사용자로부터 관대 한 도움을 받았으며 davetherock 은이 프로그램에 대한 대부분의 크레딧을받을 자격이 있습니다. 파일 이름에서 특정 단어 (수신자)를 검색 한 다음 파일을 적절한 폴더로 정렬합니다. 수신자는 변경되지 않으며 필요에 따라 추가 할 수 있습니다.

그래서 최근에는 수신자에게 파일을 보내기 전에 다른 폴더의 다른 파일 (A1)을 추가해야합니다. 이 다른 파일은 원본 파일의 이름에 명시된 이름과성에 따라 일치해야합니다. 이들은 직원의 이름이며 100 명 이상의 직원이 있습니다. 이 모든 것은 PDF 형식의 스캔입니다. 저는 손으로 해왔지만이 프로그램을 수정하여이 두 번째 파일도 찾고 원본 파일과 함께 복사 할 수 있다고 생각했습니다.

나는 좋은 진전을 이루지 못하고 있습니다.

파일 예 (임의로 이름 생성) :

내 폴더에 덤프되는 원본 파일 : Džafer Kapetanović-napotitev 13. čl. IKEA, Einrichtungshaus Graz.pdf

Nedim Muratović-napotitev 13. čl. Aldi, Vorarlberg.pdf

다른 폴더의 A1 파일 : Džafer Kapetanović-A1 13. čl. 2020 년 9 월 9 일-07.08.2021.pdf

Nedim Muratović-A1 13. čl. 2020 년 1 월 1 일-01.01.2021.pdf

그래서 나는 그것을 보내기 전에 Džafer A1 파일을 그의 원본 파일과 일치시켜야합니다. Nedim의 A1 파일과 동일합니다.

그래서 문제 :

  1. 파일명에 기록 된 이름과 성을 기준으로 원본 파일과 두 번째 파일을 일치시켜야합니다. 파일은 다른 폴더에 있습니다. A1 파일은 모두 하나의 폴더에 있으며 만료시에만 업데이트됩니다. 원본 파일은 하나의 폴더에 덤프됩니다.
  2. 이름에는 다음과 같은 문자가 있습니다. č ć š ž đ
  3. 이것을 기존 프로그램에 통합하십시오.

나는 해결책을 찾으려고 노력했고 Metaphone 알고리즘을 찾았 지만 그것이 너무 복잡하다고 생각합니다.

아래는 내 코드입니다. 나는 그것을 관련 비트로 줄였습니다.

"A1"이있는 모든 것은 새로운 두 번째 파일과 관련됩니다.

기본적으로 모든 파일 이름이 이미 코드에 의해 처리되고 있기 때문에 특히 멍청하다고 느낍니다. 파일을 일치시키는 방법과 함께 연결하는 방법을 알 수 없습니다.

때때로 파일 이름이 지정되는 방식이 내 예제와 일치하지 않지만 이름과 성은 항상 파일 이름의 첫 번째입니다.

편집 : 폴더에 파일을 덤프하는 모든 사람이 직원 이름 뒤에 "-"기호를 사용하도록 설득하면이를 사용하여 두 개의 이름 목록을 만들 수 있습니다. 아래 코드를 입력했습니다. 이제 목록을 비교 한 다음 필요한 실제 파일을 가져 오는 방법이 필요하다고 생각합니다 A1_files.

import os
import shutil
import pathlib
import pprint
import filecmp
from os.path import join
import re




dir = (#Path to the folder where the originals are dumped)
#added A1_dir to have it stored for later.
A1_dir = (#Path to the A1 folder)


#get the list of files
files = os.listdir(dir)
A1_files = os.listdir(A1_dir)

name_list = []
for filename in A1_files:
    if '-' in filename:
        file_name = filename.split('-')[0]
    else:
        file_name = filename.split('.') [0]
    if file_name not in name_list:
        name_list.append(file_name)

name_list_2 = []
for filename in files:
    if 'Posiljanje' in filename: #this is here because I wanted to see if it works the way I think it does
        print('folder')
    if '-' in filename:
        file_name = filename.split('-')[0]
    else:
        file_name = filename.split('.') [0]
    if file_name not in name_list_2:
        name_list_2.append(file_name)


    
    
    

답변

Coercer_ Nov 19 2020 at 19:45

나는 이것을 해결했지만 폴더에 파일이 하나만있는 경우에만 작동합니다.

편집 : Exelian 덕분에 예상대로 작동합니다. 교체했다 all으로 any.

지금까지 내 코드는 다음과 같습니다.

import os
import shutil
import pathlib
import pprint
import filecmp
from os.path import join
import re




dir = (#Path to the folder where the originals are dumped)
#added A1_dir to have it stored for later.
A1_dir = (#Path to the A1 folder)


#get the list of files
files = os.listdir(dir)
A1_files = os.listdir(A1_dir)

#generate first name list
name_list = []
for filename in A1_files:
    if '-' in filename:
        file_name = filename.split('-')[0]
    else:
        file_name = filename.split('.') [0]
    if file_name not in name_list:
        name_list.append(file_name)

#generate second name list
name_list_2 = []
for filename in files:
    
    if '-' in filename:
        file_name = filename.split('-')[0]
    else:
        file_name = filename.split('.') [0]
    if file_name not in name_list_2:
        name_list_2.append(file_name)

#make a list of the names that match
matched_names = [x for x in name_list if x in name_list_2]
#print here for now to see if it works
print(matched_names)

#copy files that have a matching name in their filenames. Currently only works with 1 file in the folder.
for filename in A1_files:
    full_a1_filename = os.path.join(A1_dir, filename)
    if (any(name in filename for name in matched_names)):
        print("Match found:", filename)
        shutil.copy(full_a1_filename, dir)