[python] 只知道文件名的一部分,查找匹配能对应的单个或者多个带有该部分的文件。

        在指定的文件夹中需要查找文件名中带有“虎杖”的所有文件,例如“333虎杖333.jpd”带有“虎杖”。且不需要显式的遍历整个文件夹,只需要利用 glob.glob(“与目标文件夹拼接的模糊文件路径”)即可找到对应文件夹。其中 “与目标文件夹拼接的模糊文件路径” = f"{目标文件夹地址”\\*{文件部分名}*“,其中*{文件部分名}*中的两个星号代表通配符。

1、现在excel长这样:[python] 只知道文件名的一部分,查找匹配能对应的单个或者多个带有该部分的文件。_第1张图片
2、总的病人文件夹中文件命名包含“病人”的一部分,且不好对应[python] 只知道文件名的一部分,查找匹配能对应的单个或者多个带有该部分的文件。_第2张图片
3、需要把每个病人对应的文件提取出来各自一个文件夹,命名方式可以diy。主要依赖 python的glob库,file_list = glob.glob(模糊文件地址),这里找出来的可能有多个对应文件,其返回是一个列表。代码如下:

import pandas as pd
from glob import glob
import shutil
import os

data = pd.read_excel('data.xlsx')
patients = data['病人']

path0 = '病人图片文件夹'    # 所有病人图片所在文件夹

for patient in patients:
    patient_incomplete_file_name = f"{path0}\\*{patient}*"    # f-string 为 ”病人图片文件夹\\*病人名字*,其中*号为通配符,在病人名字之前和之后都有通配符
    patient_file_list = glob(patient_incomplete_file_name)    # glob.glob 找到的是一个列表,找不到是[], 可能找到多个对应的文件
    print(f"病人{patient}对应的文件为: {patient_file_list}")

此时可以看到找到的文件为:

[python] 只知道文件名的一部分,查找匹配能对应的单个或者多个带有该部分的文件。_第3张图片

接下来实现将各个文件复制到指定文件夹:(在上面代码基础上改动最后两句)

data = pd.read_excel('data.xlsx')
patients = data['病人']

path0 = '病人图片文件夹'    # 所有病人图片所在文件夹

for patient in patients:
    patient_incomplete_file_name = f"{path0}\\*{patient}*"
    patient_file_list = glob(patient_incomplete_file_name)
    # print(f"病人{patient}对应的文件为: {patient_file_list}")
    
    if not os.path.isdir(patient):
        os.mkdir(patient)    # 创建一个新的文件夹用于存放找到的文件,并以病人名字命名
    for file in patient_file_list:
        shutil.copy(file, patient)    # 将文件复制到各个 patient 对应的文件夹,注意 shutil.copy(source, target)其中target可以是文件路径或者文件夹路径

解决!当然如果不想每次找到的是病人对应文件的列表,也可以用glob.iglob方法每次迭代一个出来,就不用写for循环了。

你可能感兴趣的:(python,开发语言)