You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何实现遍历目录删除指定文件并生成不含文件夹结构的目标文件压缩包?

如何实现遍历目录删除指定文件并生成不含文件夹结构的目标文件压缩包?

看起来你已经有了大致的思路,但几个小细节问题导致结果不符合预期——比如zip包里出现了多余的文件夹、没有精准过滤要压缩的txt文件,还有一些逻辑上的小漏洞。我来帮你修正代码并解释原因:

首先先明确你的核心需求:

  • 遍历每个student_n目录
  • 删除目录内的.html文件,清理掉可能存在的__pycache__子目录
  • 为每个学生生成独立zip包,zip内仅包含该目录下的.txt文件,且没有任何文件夹结构

修正后的完整代码

import os
import shutil
from zipfile import ZipFile, ZIP_DEFLATED
import pathlib

# 只压缩指定目录下的txt文件到zip,且zip内不含文件夹结构
def zip_create(source_dir, zip_path):
    source_path = pathlib.Path(source_dir)
    with ZipFile(zip_path, 'w', ZIP_DEFLATED) as zipf:
        # 仅遍历并添加txt格式的文件
        for file in source_path.iterdir():
            if file.is_file() and file.suffix == '.txt':
                # 通过arcname指定为文件名,彻底避免zip内出现路径结构
                zipf.write(file, arcname=file.name)

# 清理指定目录下的html文件、__pycache__,并生成目标zip包
def clean_and_zip_students(base_path):
    # 遍历基础路径下的所有条目,替代全局变量folders的用法,避免耦合
    for item in os.listdir(base_path):
        item_path = os.path.join(base_path, item)
        # 跳过系统隐藏文件和非目录条目
        if item == ".DS_Store" or not os.path.isdir(item_path):
            continue
        
        # 安全清理__pycache__目录:先检查存在性再删除,避免报错
        pycache_path = os.path.join(item_path, "__pycache__")
        if os.path.exists(pycache_path):
            shutil.rmtree(pycache_path)
            print(f"已清理缓存目录: {pycache_path}")
        
        # 删除当前学生目录下的所有html文件
        for file_name in os.listdir(item_path):
            file_path = os.path.join(item_path, file_name)
            if os.path.isfile(file_path) and file_name.endswith(".html"):
                os.remove(file_path)
                print(f"已删除HTML文件: {file_path}")
        
        # 生成对应学生的zip包,路径为基础目录下的student_n.zip
        zip_file_path = os.path.join(base_path, f"{item}.zip")
        zip_create(item_path, zip_file_path)
        print(f"已生成zip包: {zip_file_path}")

if __name__ == "__main__":
    base_path = "assignment1/student_files/"
    # 自动处理路径结尾的斜杠问题,避免手动拼接出错
    if not base_path.endswith(os.sep):
        base_path += os.sep
    clean_and_zip_students(base_path)
    print("完成HTML文件清理和学生提交文件压缩!")

关键修正点说明

  1. 解决zip包出现文件夹的问题
    原来的代码逻辑其实已经用了arcname=file.name来避免路径结构,但我在修正后的代码里额外加了file.is_file()判断,防止不小心把目录(比如没清理干净的__pycache__)加入zip包,彻底杜绝zip内出现文件夹的可能。

  2. 精准过滤要压缩的文件
    新增了file.suffix == '.txt'判断,确保只有txt文件被加入zip,完全符合你“只压缩文本文件”的需求,不会把其他格式的文件(比如残留的临时文件)误加进去。

  3. 修复__pycache__清理逻辑
    原来的代码会遍历所有子目录再尝试删除__pycache__,逻辑冗余且容易报错。现在直接定位到__pycache__目录的路径,先检查存在性再删除,既高效又不会因为目录不存在而抛出异常。

  4. 路径处理更安全可靠
    全程用os.path.join拼接路径,替代手动加斜杠的写法,避免因为系统差异(Windows/ macOS/ Linux)或路径结尾是否有斜杠导致的路径错误。

  5. 去掉冗余代码与优化日志
    删除了没用的pdb导入,给每个操作加了清晰的打印日志,方便你跟踪代码执行的每一步。

运行修正后的代码后,你会在assignment1/student_files/目录下看到每个学生对应的zip包,打开后里面只会有对应的txt文件,完全没有文件夹结构,同时html文件和缓存目录也会被正确清理。

备注:内容来源于stack exchange,提问作者Jose Ramon

火山引擎 最新活动