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

Python如何处理文件夹内xlsx、zip等多类型文件并解决相关报错

报错根因

你触发的UnicodeDecodeError本质原因是:xlsx属于二进制格式文件,你调用open(..., 'r')时默认以UTF-8文本模式打开,会触发二进制字节的解码错误。

原有代码其他逻辑问题

  • 外层存在不必要的目录全文件遍历逻辑,你不需要挨个打开目录下的所有文件,只需要处理指定的xlsx和zip包即可
  • 你定义的path是字符串类型,不能直接用path / "A001-C-002.zip"的Path对象语法拼接路径,会触发类型报错
  • 读取xlsx不需要手动构造open文件对象,pandas的read_excel直接传入文件路径即可
  • 用with上下文管理器打开zip包的情况下,不需要手动调用z.close(),上下文会自动处理资源释放
  • 存在变量名重复问题:外层循环的filename和zip内遍历的filename重名,会导致逻辑混乱
  • 判断zip内的条目是不是目录不能用os.path.isdir,该方法是判断本地文件系统的路径,不适用于zip内的虚拟路径,应该用zip对象的getinfo(filename).is_dir()方法

修正后完整代码

from pathlib import Path
import pandas as pd
import zipfile
import os

# 定义工作目录路径,用Path对象处理更方便
base_path = Path("./../../")
os.chdir(base_path)

# 1. 读取抗体元数据xlsx为DataFrame
ab_file = "HUBMAP B004 codex antibodies metadata.xlsx"
ab_df = pd.read_excel(ab_file)
print(f"Antibody metadata column names:\n {ab_df.columns.values}")

# 2. 处理A001压缩包内的所有文件
zip_file = "A001-C-002.zip"
with zipfile.ZipFile(zip_file) as z:
    for zip_entry in z.namelist():
        # 排除zip内的目录,只处理文件
        if not z.getinfo(zip_entry).is_dir():
            # 以下为处理文件的示例逻辑,你可以根据实际需求修改
            with z.open(zip_entry) as f:
                for line in f:
                    # 如果需要将二进制行解码为字符串,可以指定对应编码,需忽略错误可加errors='ignore'
                    # print(line.decode('utf-8', errors='ignore'))
                    print(line)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:45:03