python - 在python中,我可以在两个文件夹(名称)之间使用特殊字符匹配文件名的一部分,然后将找到的匹配复制到第二个文件夹中吗?
问题描述
不久前,我编写了一个程序来帮助我将文件从为我转储到的公共文件夹中分类到不同的文件夹中,具体取决于文件需要发送到的位置。我从 StackOverflow 上的用户那里得到了慷慨的帮助,并且davetherock值得这个程序的大部分功劳。它在文件名中搜索特定的单词——收件人——然后将文件分类到适当的文件夹。收件人不会改变,我可以根据需要添加它们。
所以最近我必须从不同的文件夹中添加另一个文件(称为 A1),然后才能将文件发送给他们的收件人。该其他文件必须根据原始文件名称中的姓名和姓氏进行匹配。这些是员工的名字,有一百多名员工。所有这些都是PDF格式的扫描。我一直在手工做,但我想我可以修改这个程序来找到第二个文件并将它与原始文件一起复制。
我没有取得任何好的进展。
文件示例(我随机生成的名称):
转储到我的文件夹中的原始文件:Džafer Kapetanović - napotitev 13. čl。宜家,Einrichtungshaus Graz.pdf
Nedim Muratović - napotitev 13. čl。福拉尔贝格州阿尔迪.pdf
其他文件夹中的 A1 文件:Džafer Kapetanović - A1 13. čl。09.09.2020 - 07.08.2021.pdf
Nedim Muratović - A1 13。01.01.2020 - 01.01.2021.pdf
所以我必须在发送之前将 Džafer A1 文件与他的原始文件进行匹配。与 Nedim 的 A1 文件相同。
所以,问题:
- 必须根据名称和姓氏将原始文件与第二个文件匹配,并将其写入文件名。文件位于不同的文件夹中。A1 文件都在一个文件夹中,只有在到期时才会更新。原始文件被转储到一个文件夹中。
- 名称的特征如下: č ć š ž đ
- 将其合并到现有程序中(希望如此)。
我试图想出一个解决方案,并找到了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)
推荐阅读
- javascript - 如何将道具发送到点击处理程序 - React JS
- ios - 快速在表格视图中添加滑动按钮
- javascript - 使用画布连接具有相同类的元素
- spring - Spring在类路径中找不到文件,但它就在war文件的根目录下
- java - tink 库 com.google.protobuf.GeneratedMessageV3$ 无法解析
- php - 如何判断 .php 文档中文件的路径?
- java - 是否可以将类(在 diff 模块中)添加到类路径并将其与反射一起使用
- java - 如何使用没有屏幕的java机器人模拟鼠标点击
- grafana - tidb grafana 没有数据点
- java - 使用 AWS4Signer 签署获取请求:我们计算的请求签名与您提供的签名不匹配