在 python 中,我可以在两个文件夹(名称)之间匹配文件名的一部分和特殊字符,然后将找到的匹配项复制到第二个文件夹中吗?

In python, can I match part of a file name with special characters between two folders (names) and then copy the found match in the second folder?

前段时间我写了一个程序来帮助我将文件从一个公共文件夹中整理出来,根据文件需要发送到不同的文件夹。我在 Whosebug 上得到了用户的慷慨帮助,davetherock 应该为这个程序赢得大部分荣誉。它搜索文件名中的特定词 - 收件人 - 然后将文件分类到适当的文件夹中。收件人不会改变,我可以根据需要添加他们。

所以最近我不得不从不同的文件夹添加另一个文件(称为 A1),然后才能将文件发送给他们的收件人。必须根据原始文件名称中所述的名称和姓氏来匹配此其他文件。这些是员工的名字,有一百多个员工。所有这些都是 PDF 格式的扫描件。我一直在手工完成,但我想我可以修改这个程序来找到第二个文件并将它与原始文件一起复制。

我没有取得任何好的进展。

文件示例(我随机生成的名称):

转储到我的文件夹中的原始文件:Džafer Kapetanović - napotitev 13.čl。宜家,Einrichtungshaus Graz.pdf

Nedim Muratović - napotitev 13. cl。阿尔迪,Vorarlberg.pdf

其他文件夹中的 A1 文件:Džafer Kapetanović - A1 13.čl。 09.09.2020 - 07.08.2021.pdf

Nedim Muratović - A1 13. čl。 01.01.2020 - 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)


    
    
    

我已经解决了这个问题,但只有当文件夹中只有一个文件时才有效。

编辑:多亏了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)