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

Python如何读取未知文件名的Zip文件并实现内容自动分类?

问题解决方案

错误原因

glob() 返回的是匹配到的所有ZIP文件路径的列表,而 ZipFile 构造函数需要传入单个文件路径字符串,直接传列表就会触发 AttributeError。另外代码里还有个问题:你调用的是 ZipFile.namelist() 类方法,正确的应该用实例对象 read_zip 来调用。

修复后的代码方案

情况1:目录中每次只有一个ZIP文件

直接取列表的第一个元素(确保目录里确实只有一个zip):

from zipfile import ZipFile
from glob import glob
import os
import shutil

# 替换成你要移动到的目标目录路径
target_dir = r"C:\me\Python\target_folder"

# 获取所有zip文件路径
zip_paths = glob(r"C:\me\Python\map_dumper\*.zip")
if zip_paths:
    # 取第一个匹配到的zip文件
    zip_path = zip_paths[0]
    with ZipFile(zip_path, "r") as read_zip:
        # 创建临时提取目录
        temp_extract_dir = r"C:\me\Python\temp_extract"
        read_zip.extractall(temp_extract_dir)
        
        # 将提取的内容移动到目标目录
        for root, dirs, files in os.walk(temp_extract_dir):
            for file in files:
                src_path = os.path.join(root, file)
                # 保持原压缩包内的目录结构
                rel_path = os.path.relpath(src_path, temp_extract_dir)
                dest_path = os.path.join(target_dir, rel_path)
                # 创建目标子目录(如果不存在)
                os.makedirs(os.path.dirname(dest_path), exist_ok=True)
                shutil.move(src_path, dest_path)
        
        # 清理临时目录
        shutil.rmtree(temp_extract_dir)
else:
    print("目录中未找到ZIP文件")

情况2:目录中有多个ZIP文件,需要逐个处理

遍历glob返回的列表,逐个处理每个zip:

from zipfile import ZipFile
from glob import glob
import os
import shutil

target_dir = r"C:\me\Python\target_folder"
zip_paths = glob(r"C:\me\Python\map_dumper\*.zip")

for zip_path in zip_paths:
    with ZipFile(zip_path, "r") as read_zip:
        # 为每个zip创建独立的临时提取目录
        zip_name = os.path.basename(zip_path).replace(".zip", "")
        temp_extract_dir = os.path.join(r"C:\me\Python\temp_extract", zip_name)
        read_zip.extractall(temp_extract_dir)
        
        # 移动文件到目标目录
        for root, dirs, files in os.walk(temp_extract_dir):
            for file in files:
                src_path = os.path.join(root, file)
                rel_path = os.path.relpath(src_path, temp_extract_dir)
                dest_path = os.path.join(target_dir, rel_path)
                os.makedirs(os.path.dirname(dest_path), exist_ok=True)
                shutil.move(src_path, dest_path)
        
        shutil.rmtree(temp_extract_dir)
    # 可选:处理完后删除原ZIP文件
    # os.remove(zip_path)

关键注意点

  • 确保目标目录和临时目录有读写权限
  • 如果不需要保持原压缩包内的目录结构,可以直接提取到目标目录,跳过相对路径处理
  • 临时目录用于避免直接提取时的文件冲突,处理完成后记得清理

内容的提问来源于stack exchange,提问作者Dennis Heemskerk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:50:26