通过标记关键字定位CSV指定区块 利用pandas读取区间有效数据
带特殊边界标记CSV的Pandas读取方案
实现逻辑
- 精准定位
$$SOE与$$EOE两个标记的行位置,仅读取两个标记包裹的业务数据段,全程跳过前置、后置冗余内容 - 流式逐行读取文件,不一次性加载全量文件入内存,适配GB级大文件场景
- 自动适配示例文件中“字段带前置空格、中间夹杂空列、行尾带多余逗号”的格式特征
可直接运行的代码实现
第一步:定位两个标记的行号位置
import pandas as pd # 替换为实际文件路径 file_path = "target_file.csv" soe_row = None eoe_row = None # 逐行扫描匹配标记,遇到结束标记直接终止扫描,减少无意义IO with open(file_path, "r", encoding="utf-8") as f: for row_idx, row_content in enumerate(f): stripped_content = row_content.strip() if stripped_content == "$$SOE": soe_row = row_idx if stripped_content == "$$EOE": eoe_row = row_idx break # 标记完整性校验 if soe_row is None or eoe_row is None: raise ValueError("未在文件中完整识别到$$SOE/$$EOE标记,请检查文件内容")
第二步:读取标记区间内的有效数据
target_df = pd.read_csv( file_path, skiprows=soe_row + 1, # 跳过$$SOE行及之前的所有冗余内容 nrows=eoe_row - soe_row - 1, # 仅读取两个标记之间的有效行数 header=None, # 目标数据段无内置表头,关闭自动表头识别 skipinitialspace=True, # 自动清除字段前后的冗余空格 encoding="utf-8" )
示例场景适配调整
- 清理全空列:读取完成后执行
target_df = target_df.dropna(axis=1, how="all"),可直接移除示例中夹杂的两个全空列 - 日期格式转换:对第一列的日期字符串执行
target_df[0] = pd.to_datetime(target_df[0]),即可转为pandas原生时间类型,支持后续时间筛选、聚合计算 - 编码适配:如果文件是Windows导出的gbk编码,将open和read_csv中的
encoding="utf-8"替换为encoding="gbk"即可正常读取,不会出现乱码
性能特性
- 标记扫描阶段逐行读取,不会一次性加载大文件进内存
- pandas读取阶段基于行偏移流式解析,源文件达到10G以上规模也不会出现内存溢出
- 扫描阶段遇到
$$EOE标记会提前终止读取,不会加载标记后的冗余内容,进一步降低IO耗时
内容的提问来源于stack exchange,提问作者reillyderrick
相关产品推荐
相关产品推荐

