0

0

如何动态定位 CSV 文件中数据起始行并用 Pandas 读取

聖光之護

聖光之護

发布时间:2026-02-05 17:16:02

|

798人浏览过

|

来源于php中文网

原创

如何动态定位 CSV 文件中数据起始行并用 Pandas 读取

本文介绍一种高效、无需预扫描文件的方案:在流式读取过程中实时跳过无关行,精准定位以 [deal type] 开头的首列标题行,并将其作为 read_csv() 的数据起点。

在实际数据处理工作中,我们常遇到结构不规范的 CSV 文件——真正的数据并非从第一行开始,且“前导垃圾行”(如报告标题、元信息、空行、分隔符等)数量不固定。此时,硬编码 skiprows=12 或依赖固定偏移量极易出错。Pandas 的 read_csv() 虽提供 skiprows、skipfooter、header 等参数,但均要求提前知道行号,无法应对动态起始位置。

幸运的是,Python 的文件对象是可迭代的迭代器(file_in),支持逐行遍历与状态控制。我们可以利用这一特性,在打开文件后先“预读”若干行,直到命中标志性的列标题(如 [Deal Type]),然后将当前文件指针位置之后的内容直接交由 pandas.read_csv() 解析——而无需二次读取或临时保存中间内容。

关键在于:pandas.read_csv() 支持从任意类文件对象(如 io.StringIO、io.BytesIO 或已打开的 TextIOWrapper)读取,且会自动从当前位置开始解析。因此,只需在循环中调用 break 跳出后,file_in 的内部指针已停在目标标题行(含)之后的下一行,即真实数据的第一行。

以下为完整可运行示例(使用 io.StringIO 模拟文件;生产环境替换为 open('data.csv', 'r', encoding='utf-8')):

科大讯飞-AI虚拟主播
科大讯飞-AI虚拟主播

科大讯飞推出的移动互联网智能交互平台,为开发者免费提供:涵盖语音能力增强型SDK,一站式人机智能语音交互解决方案,专业全面的移动应用分析;

下载
import pandas as pd
import io

# 示例数据(模拟每日收到的不规则 CSV)
raw_content = """Counterparty Name
ID Number

.
.
.

Asset
USD.HO
USD.LCO
USD.RB

Cpty:
Product:

[Deal Type],[Amount],[Currency],[Date]
D1,100000.5,USD,2024-01-01
D2,75000.0,EUR,2024-01-02
"""

# 使用 StringIO 模拟文件流
with io.StringIO(raw_content) as f:
    # 逐行扫描,寻找数据起始标志
    for line in f:
        if line.strip().startswith("[Deal Type]"):
            break
    else:
        raise ValueError("未找到包含 '[Deal Type]' 的标题行,请检查输入格式")

    # 此时 f 的指针已位于标题行之后,read_csv 自动从此处读取
    df = pd.read_csv(f, skiprows=0)  # skiprows=0 表示不额外跳过(标题行已在上一步读取)

print(df)

输出结果:

  Deal Type   Amount Currency        Date
0      D1  100000.5      USD  2024-01-01
1      D2   75000.0      EUR  2024-01-02

⚠️ 注意事项:

  • 编码兼容性:若 CSV 含中文或特殊字符,请在 open() 中显式指定 encoding='utf-8-sig'(推荐)或 encoding='gbk',避免 UnicodeDecodeError;
  • 标题行识别鲁棒性:建议使用 line.strip().startswith("[Deal Type]") 而非 line.startswith("[Deal Type]"),以忽略前导空白;
  • 异常处理:务必添加 else 子句捕获未匹配情况(如示例所示),防止静默失败;
  • 内存效率:该方法为单次流式读取,不加载全文本到内存,适用于大文件;
  • 列名解析:若标题行含方括号(如 [Deal Type]),read_csv() 默认会将其作为列名(显示为 'Deal Type')。如需去除方括号,可在读取后执行 df.columns = df.columns.str.strip('[]')。

此方案兼顾简洁性、健壮性与性能,是处理“头部噪声”CSV 的工业级实践。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

72

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

3

2026.01.31

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

120

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

258

2025.10.24

java连接字符串方法汇总
java连接字符串方法汇总

本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

7

2026.02.05

java中fail含义
java中fail含义

本专题整合了java中fail的含义、作用相关内容,阅读专题下面的文章了解更多详细内容。

8

2026.02.05

控制反转和依赖注入区别
控制反转和依赖注入区别

本专题整合了控制反转和依赖注入区别、解释、实现方法相关内容。阅读专题下面的文章了解更多详细教程。

11

2026.02.05

钉钉脑图插图教程合集
钉钉脑图插图教程合集

本专题整合了钉钉脑图怎么插入图片、钉钉脑图怎么用相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.02.05

python截取字符串方法汇总
python截取字符串方法汇总

本专题整合了python截取字符串方法相关合集,阅读专题下面的文章了解更多详细内容。

2

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号