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
相关产品推荐
相关产品推荐

