首页 > 解决方案 > 如何以最有效的方式根据数据框中的标准传输文件集合

问题描述

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

我有一个包含很多文件(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行对应名称的文件夹中。

但我想这需要很长时间。我正在寻找最有效的方法来做到这一点。使用我的方法,它几乎令人敬畏,因为它需要遍历每个文件的整个数据框。

提前致谢

标签: pythonpandasfiledataframecoding-efficiency

解决方案


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

例如,如果你的 df 像

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

通过以下方式选择所有重复行:

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

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

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)

推荐阅读