如何读取含多工作表的CSV文件筛选数据后生成同格式CSV
解决方案前提说明
首先明确:标准CSV格式本身不支持多工作表(Sheet)结构,你提到的「包含多个工作表的CSV文件」大概率是以下两类常见情况,对应不同的处理方案:
情况1:实际为多Sheet的Excel文件,仅后缀被误命名为.csv
这是最高频的场景,很多用户修改文件后缀名时误将.xlsx/.xls改成了.csv,导致pandas.ExcelReader读取时识别异常。
处理步骤如下:
- 先改回文件原本的后缀(.xlsx或.xls),再使用
pandas.ExcelFile读取多Sheet内容 - 逐Sheet筛选数据后,直接按原Sheet结构写回新文件即可,示例代码:
import pandas as pd # 读取多Sheet Excel文件 excel_file = pd.ExcelFile("修正后缀后的文件.xlsx") # 获取所有Sheet名 sheet_names = excel_file.sheet_names # 初始化写对象 writer = pd.ExcelWriter("筛选后的新文件.xlsx", engine="openpyxl") for sheet in sheet_names: # 读取单个Sheet数据 df = excel_file.parse(sheet) # 此处替换为你的自定义筛选逻辑,示例为筛选列A值大于10的行 filtered_df = df[df["列A"] > 10] # 写入对应Sheet,保留原Sheet名 filtered_df.to_excel(writer, sheet_name=sheet, index=False) # 保存文件 writer.close()
如果需要输出CSV格式,每个Sheet对应生成一个独立的CSV文件即可,修改写入逻辑为filtered_df.to_csv(f"筛选后_{sheet}.csv", index=False)。
情况2:单个纯文本CSV文件内用特殊分隔符拆分了多块数据,被定义为多「Sheet」
这种场景下CSV文件内一般有明确的分隔标记(比如空行、特殊字符串标识不同Sheet的开头),处理逻辑如下:
- 先用Python内置的
csv模块按行读取整个文件,识别分隔标记拆分出不同「Sheet」的数据块 - 逐块转换为DataFrame做筛选,再按原分隔规则拼接写回新的CSV文件即可,示例代码框架:
import csv import pandas as pd sheet_blocks = [] current_block = [] # 此处替换为你实际的Sheet分隔判断逻辑,示例为遇到空行就拆分新Sheet with open("你的文件.csv", "r", encoding="utf-8") as f: reader = csv.reader(f) for row in reader: if not row: # 空行作为Sheet分隔符 if current_block: sheet_blocks.append(current_block) current_block = [] else: current_block.append(row) # 加入最后一个块 if current_block: sheet_blocks.append(current_block) # 逐块筛选后写回 with open("筛选后的新文件.csv", "w", encoding="utf-8", newline="") as f: writer = csv.writer(f) for idx, block in enumerate(sheet_blocks): # 转换为DataFrame,第一行为表头 df = pd.DataFrame(block[1:], columns=block[0]) # 自定义筛选逻辑 filtered_df = df[df["筛选列"] == "目标值"] # 写回表头+数据 writer.writerow(filtered_df.columns.tolist()) writer.writerows(filtered_df.values.tolist()) # 除了最后一个块,其他块末尾加分隔空行 if idx != len(sheet_blocks) -1: writer.writerow([])
注意:如果你的需求是最终输出多Sheet的类Excel文件,直接输出xlsx格式即可,CSV本身无法承载多Sheet结构,不可能生成「多Sheet的CSV文件」。
内容的提问来源于stack exchange,提问作者Ashutosh Tiwari
相关产品推荐
相关产品推荐

