python - 如何以最有效的方式根据数据框中的标准传输文件集合
问题描述
可能我选择的主题不是一个好主题。但我会解释得很清楚。我的目的是想出最有效的方法,因为文件数量很大,可能需要很长时间。
我有一个包含很多文件(300K)的文件夹。这些文件有名字。他们名字中的图案是这样的:
09060083_1542296310_2_CON_ENT-Floor-Practice_2015-09-25-false_MRB3738.txt
以这个文件的名义,一件事情对我来说很重要:
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
通过以下方式选择所有重复行:
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)
推荐阅读
- metpy - 为什么单位名称“mb”对应于“millibarns”,而不是“millibars”?
- powershell - 如何安排此 .ps1 文件每天运行?
- c# - Entity Framework Core:限制外键列彼此相等
- vb.net - 如何并行运行 3 个子程序并等到所有三个子程序都完成后才能在 VB 中继续
- php - 树枝渲染文件类型
- python - 正确检查电话号码在df中是否为假的干净方法
- java - 通过在 jtextfield 中获取字符串,在 java 中使用 LIKE 选择所有数据
- db2 - 将 IBM Watson Assistant 聊天机器人连接到 Db2
- sql - 使用 ANSI sql 将列转置为行
- android - Google Play 商店“不支持所需的屏幕密度和尺寸”尽管允许所有