You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量删除支持工单目录时触发TypeError错误,寻求技术解决

解决shutil.rmtree()的类型错误问题

首先看你遇到的错误:TypeError: lstat: path should be string, bytes or os.PathLike, not set,原因很直接——你把一个集合对象传给了shutil.rmtree(),但这个函数只能接收单个的路径字符串,根本不知道怎么处理集合。

咱们一步步修正你的代码:

问题点拆解

  1. 你通过set(list_a)-set(list_b)得到了要删除的目录名集合,但list_b是DataFrame,直接转集合会有问题(它会把整个列的结构转成集合,而不是列里的每个值)
  2. 你拿到的目录名是相对/短名称,需要和根目录拼接成完整路径才能删除
  3. 不能直接把集合丢给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 16:27:39