使用Pandas读取zip压缩包内全部txt文件的代码调整及报错解决
问题说明
你当前遇到两个核心问题:
- 原代码仅能读取单文件的原因:你确实猜对了问题根源,
zip_csv_file = zip_csv_files[0]是取符合条件的文件列表的第一个元素,所以永远只能处理1个txt文件,没有遍历所有符合条件的文件 - 后续报错
UnboundLocalError的原因:部分下载的zip压缩包内不存在「后缀为.txt、文件名不含pre」的文件,导致zip_csv_files是空列表,你修改代码时没有做空列表判断就直接引用zip_csv_file变量,触发了未赋值就引用的错误
修正后完整代码
def custom_parse(self, response): self.logger.info(response.url) links = response.xpath("//a[contains(@href, '.zip')]/@href").getall() for link in list(set(links)): print(link) local_path = self.download_file("https://www.sec.gov" + link) zip_file = zipfile.ZipFile(local_path) # 筛选符合条件的txt文件 zip_csv_files = [file_name for file_name in zip_file.namelist() if file_name.endswith(".txt") and "pre" not in file_name] # 空列表判断,没有符合条件的文件直接跳过当前压缩包 if not zip_csv_files: continue # 遍历所有符合条件的文件,替代原来只取第一个的逻辑 for zip_csv_file in zip_csv_files: with zip_file.open(zip_csv_file, "r") as zip: df = pd.read_csv(BytesIO(zip.read()), dtype=str, sep='\t') df = self.standardized(df) for k, row in df.iterrows(): yield dict(row)
修改点说明
- 增加了空列表判断逻辑,不存在符合条件的文件时直接跳过当前压缩包,避免变量未定义报错
- 将原来仅取第一个文件的逻辑替换为遍历所有符合条件的文件,每个文件都会单独读取、处理并输出结果
内容的提问来源于stack exchange,提问作者flyingtoaster
相关产品推荐
相关产品推荐

