如何以最有效的方式根据数据框中的条件传输文件集合

how to transfer a collection of files based on criteria in data frame in the most efficient way

可能我选择的科目不是一个好科目。但我会非常清楚地解释。我的目的是想出最有效的方法,因为文件数量很大,可能需要很长时间。

我有一个包含很多文件(300K)的文件夹。这些文件有名字。他们名字中的模式是这样的:

09060083_1542296310_2_CON_ENT-Floor-Practice_2015-09-25-false_MRB3738.txt

在这个文件的名称中,有一件事对我很重要:

  1. 09060083 我简单提取了

我也有一个数据框。我的数据框如下所示:

            Clinic Number  6month
1              09060083     1
2              494383       4
13             494383       4
14             494383       1
17             494382       9
21             494382       4
25             494383       4
28             494383       4
29             994381       5
30             994383      10

门诊号与文件名第1-8位相同。现在我想根据一些条件将一些文件传输到另一个文件夹。

我的文件夹名称基于数据框中的 6month column。所以我有 10 个文件夹名称 1 2 3... 10.

我做这个的简单方法是提取文件名的字符1到8,然后与数据框中的Clinic Number column比较,如果他们同样传输到该行相应名称为 6month column 的文件夹。

但我想这需要很长时间。我正在寻找最有效的方法。使用我的方法,它几乎很棒,因为它需要为每个文件遍历整个数据帧。

提前致谢

您可以找到重复的诊所条目​​,然后将相应的文件移动到相应的文件夹。

例如如果你的 df 像

Clinic_Num  6month Filename
09060083     1     09060083_blah
494383       4     494383_blah1
494383       4     494383_blah2
494383       1     494383_blah3

Select 所有重复行:

df_to_be_moved = df[df.duplicated(subset='Clinic_Num')]

现在,您的 df_to_moved 将像:

Clinic_Num  6month Filename
494383       4     494383_blah2
494383       1     494383_blah3

现在您可以根据目标文件夹 select 行并获取该文件夹的文件路径列表并移动它们。

import os, shutil
BASE_PATH = "C:\Users\M193053\Documents\"

for idx in range(1,11):  # folder name
    folder_name = os.path.join(BASE_PATH, "folder_"+str(idx))
    os.makedirs(folder_name, exist_ok=True)
    matches = df_to_be_moved[df_to_be_moved['6month']==idx].Filename.tolist()
    matches = [os.path.join(BASE_PATH, filename) for filename in matches]
    for file in matches:
        shutil.move(file, folder_name)