批量删除支持工单目录时触发TypeError错误,寻求技术解决
解决
shutil.rmtree()的类型错误问题 首先看你遇到的错误:TypeError: lstat: path should be string, bytes or os.PathLike, not set,原因很直接——你把一个集合对象传给了shutil.rmtree(),但这个函数只能接收单个的路径字符串,根本不知道怎么处理集合。
咱们一步步修正你的代码:
问题点拆解
- 你通过
set(list_a)-set(list_b)得到了要删除的目录名集合,但list_b是DataFrame,直接转集合会有问题(它会把整个列的结构转成集合,而不是列里的每个值) - 你拿到的目录名是相对/短名称,需要和根目录拼接成完整路径才能删除
- 不能直接把集合丢给
rmtree,得遍历集合里的每个目录,逐个删除
修正后的完整代码
import pandas as pd import os import shutil # 获取目录路径 cases_dir = input("Please enter your files directory: ") # 获取目录下的所有子目录/文件(这里假设都是工单目录) cases_list = os.listdir(cases_dir) # 读取开放工单CSV,只保留Number列,更高效 open_cases = pd.read_csv("cases.csv", usecols=["Number"]) # 把工单编号转成字符串(避免CSV读进来是数字,和目录名字符串不匹配) open_cases["Number"] = open_cases["Number"].astype(str) # 转成集合方便快速对比 open_case_numbers = set(open_cases["Number"].tolist()) # 计算需要删除的工单目录:存在于cases_dir但不在开放工单里的 dirs_to_delete = [name for name in cases_list if name not in open_case_numbers] # 遍历删除每个目录 for dir_name in dirs_to_delete: full_path = os.path.join(cases_dir, dir_name) # 先判断是不是目录,避免误删文件 if os.path.isdir(full_path): print(f"Deleting directory: {full_path}") shutil.rmtree(full_path, ignore_errors=False, onerror=None)
关键修改说明
- 读取CSV时用
usecols直接指定只加载Number列,比先读全量再删列更简洁高效 - 把工单编号转成字符串:如果你的目录名是类似
"CASE-123"的字符串,而CSV里的Number是数字123,直接对比会不匹配,转字符串后才能正确对应 - 用列表推导式生成要删除的目录列表,集合是无序的,列表遍历更直观可控
- 拼接完整路径:
os.listdir只返回文件名,必须和根目录拼接成完整路径,shutil.rmtree才能找到正确的位置 - 增加
os.path.isdir判断:避免误删目录下的零散文件(如果存在的话)
这样修改后,就能正确遍历并删除所有已关闭工单对应的目录了。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

