Pandas读写CSV/TXT全攻略:read_csv与to_csv参数详解

发布时间:2026/9/3 2:16:23

Pandas读写CSV/TXT全攻略:read_csv与to_csv参数详解
写了一个多月的 CSV 实战脚本回头发现自己对pd.read_csv()的理解其实只停留在“能跑就行”。直到某天接手一份带时间、带单位、还带着乱码的中文业务表才被sep、encoding、dtype、parse_dates这些参数挨个教做人。这篇文章就把 Pandas 读写 txt 和 csv 文件的完整用法拆开讲清楚重点落在read_csv和to_csv的常用参数说明与代码实战上。零基础读者可以跟练有一点基础的朋友也能直接跳到自己需要的参数和坑点部分查捡。1. pandas 读写文件的背景与核心概念1.1 为什么优先选择 pandas 处理 csvCSVComma-Separated Values逗号分隔值是一种纯文本表格格式每一行是一条记录同一行内用逗号分隔多个字段。它没有复杂的二进制结构几乎所有数据分析工具和数据库都支持导入、导出 CSV因此成为数据交换最常用的格式。txt 文件则更宽泛如果内容是结构化文本也可以借助 pandas 按分隔符解析成表格。相比 Python 内置的csv模块pandas 的优势在于一行代码完成文件读取并自动识别表头。返回的是DataFrame数据处理能力更强。支持指定类型、解析日期、缺失值替换、索引列等高级操作。写出时能灵活控制分隔符、是否包含索引、编码、列顺序等。在实际的数据分析、爬虫数据清洗、机器学习特征工程中read_csv和to_csv是很高频的两个函数。1.2 容易混淆的几个概念CSV 文件和 TXT 文件CSV 本质上是 txt 的一种特例只是约定使用逗号分隔。Pandas 的read_csv也可以读取 txt只要在sep参数中指定正确的分隔符例如制表符\t、竖线|、正则空白\s。read_csv 与 read_tableread_csv默认分隔符是逗号read_table默认分隔符是制表符。两者底层实现一致新手从read_csv入门更合适。注意不要把to_csv理解为只能写 CSV 文件它可以写任意分隔符的文本文件只是文件后缀习惯上保留为.csv。2. 环境准备与版本说明2.1 运行环境本文示例使用的环境如下具体版本请以你本机为准操作系统Windows / macOS / Linux 均可Python需要 Python 3.8 及以上版本pandas2.x 或 1.5.x 均可核心 API 基本相同推荐使用 Jupyter Notebook 或 VS Code 运行示例如果本地还没有安装 pandas可以在终端执行pip install pandas如果需要解决某些 Excel 文件相关功能可以再安装 openpyxl但本文只涉及文本文件不需要额外安装。2.2 示例文件准备建议在本地新建一个工作目录例如pandas_file_demo并在目录下准备好一份演示数据。为了演示方便下面直接通过 pandas 创建一份测试数据import pandas as pd df pd.DataFrame({ 姓名: [张三, 李四, 王五], 城市: [北京, 上海, 广州], 年龄: [25, 30, 35], 入职日期: [2021-01-15, 2022-06-01, 2023-03-20] }) df.to_csv(employee.csv, indexFalse, encodingutf-8) print(演示文件已生成)执行后工作目录下会生成employee.csv文件内容类似姓名,城市,年龄,入职日期 张三,北京,25,2021-01-15 李四,上海,30,2022-06-01 王五,广州,35,2023-03-20后面的示例都会基于这份文件展开。3. read_csv 常用参数详解这部分是本文的核心。先看最基础的读取方式import pandas as pd df pd.read_csv(employee.csv) print(df)输出结果姓名 城市 年龄 入职日期 0 张三 北京 25 2021-01-15 1 李四 上海 30 2022-06-01 2 王五 广州 35 2023-03-20可以看到pandas 自动把第一行当作列名并从第二行开始读取数据。3.1 sep指定分隔符当 CSV 文件不是用逗号分隔时就需要显式指定sep。例如一个制表符分隔的 txt 文件df_tab pd.read_csv(employee.txt, sep\t)如果文件里多个空格、制表符混合可以使用正则表达式df_space pd.read_csv(employee.txt, sep\s)此时 pandas 会以一个或多个空白字符作为分隔符。3.2 header指定表头所在行默认header0表示第一行是列名。如果没有表头可以设置headerNone然后自己指定列名df_no_header pd.read_csv(employee.csv, headerNone, names[name, city, age, date])如果数据中间某一行才是真正的列名可以用header2表示第三行作为列名。实际场景中常见于部分导出的数据文件前两行带说明文字。3.3 encoding解决乱码问题这是中文场景下最高频的问题。文件编码和 pandas 默认解析编码不一致时会出现UnicodeDecodeError或乱码。常见写法df_gbk pd.read_csv(employee_gbk.csv, encodinggbk) df_utf8 pd.read_csv(employee_utf8.csv, encodingutf-8)如果不确定文件编码可以先尝试utf-8报错后再尝试gbk、gb18030、latin1。3.4 index_col设置索引列如果想让某一列作为行索引而不是默认的 0、1、2 整数索引df_index pd.read_csv(employee.csv, index_col0)表示把第一列“姓名”作为索引城市 年龄 入职日期 姓名 张三 北京 25 2021-01-15也可以传入列名df_index pd.read_csv(employee.csv, index_col姓名)3.5 usecols只读取部分列当文件有几十列但只需要其中几列时usecols能显著减少内存和读取时间df_sub pd.read_csv(employee.csv, usecols[姓名, 年龄])也可以按位置选择df_sub pd.read_csv(employee.csv, usecols[0, 2])3.6 dtype指定列的数据类型Pandas 默认会自动推断类型但某些列如手机号、身份证号会被误判为整数导致前导零丢失。此时需要显式指定df_dtype pd.read_csv(employee.csv, dtype{年龄: int32})对于包含手机号等冗余文本的列df_dtype pd.read_csv(member.csv, dtype{手机号: str})建议对所有应为字符串但可能被误判的列统一指定str。3.7 parse_dates把文本解析为日期如果希望入职日期列读进来就是datetime64类型df_date pd.read_csv(employee.csv, parse_dates[入职日期]) print(df_date.dtypes)输出姓名 object 城市 object 年龄 int64 入职日期 datetime64[ns] dtype: object之后可以直接做日期运算。3.8 na_values指定缺失值标记有些数据文件用“NA”“NULL”“-”“未知”等字符串表示缺失值。通过na_values可以统一替换为NaNdf_na pd.read_csv(employee.csv, na_values[-, 未知, NULL])3.9 nrows只读取前 N 行需要快速查看大数据文件前几行时用nrows限制读取行数避免加载整个文件df_head pd.read_csv(employee.csv, nrows2)3.10 chunksize分块读取大文件当文件很大、内存放不下时可以分块读取每次处理一个 chunkchunk_iter pd.read_csv(big_file.csv, chunksize10000) total_rows 0 for chunk in chunk_iter: total_rows len(chunk) print(f总行数{total_rows})这是生产环境中处理超大 CSV 的常用方式。4. to_csv 常用参数详解to_csv是把 DataFrame 写回文本文件的接口。基础用法df.to_csv(output.csv, indexFalse)4.1 path_or_buf输出路径第一个参数可以直接传入文件路径字符串也支持传入文件对象。例如with open(output_utf8.csv, w, encodingutf-8, newline) as f: df.to_csv(f, indexFalse)使用文件对象的好处是可以灵活控制打开模式和编码。4.2 sep写入分隔符如果希望写出制表符分隔的 txt 文件df.to_csv(output.tsv, sep\t, indexFalse)4.3 index是否写入行索引默认indexTrue会在第一列写入Unnamed: 0这类索引列。绝大多数业务场景都不需要保留索引所以显式设置indexFalse是最推荐的做法。df.to_csv(output_no_index.csv, indexFalse)4.4 header是否写入列名默认headerTrue即写入表头。如果只需要纯数据df.to_csv(output_no_header.csv, headerFalse)这种写法在数据追加场景中很常见。4.5 columns指定写出列顺序如果只想写出部分列或调整列顺序df.to_csv(output_selected.csv, columns[姓名, 年龄], indexFalse)4.6 encoding写入编码国内业务系统对中文兼容性最好的是utf-8或utf-8-sig。如果需要用 Excel 直接打开建议用utf-8-sig因为带 BOM 的文件在 Excel 中不会乱码df.to_csv(output_excel.csv, indexFalse, encodingutf-8-sig)4.7 mode追加模式当多个 DataFrame 需要写入同一个文件时第二次写可以使用追加模式df1.to_csv(all_data.csv, indexFalse) df2.to_csv(all_data.csv, indexFalse, headerFalse, modea)这里第二次写入时headerFalse避免重复写表头。4.8 float_format控制浮点数格式浮点列过多位小数时会写出一长串数字可以格式化df_score pd.DataFrame({score: [88.123456, 92.987654]}) df_score.to_csv(score.csv, indexFalse, float_format%.2f)4.9 na_rep缺失值写入表示默认缺失值写为空字符串可以自定义df.to_csv(output_na.csv, indexFalse, na_repNULL)5. pandas 读写 txt 文件实战5.1 读取空格分隔的 txt现有scores.txt内容如下name math english Alice 90 88 Bob 78 95 Cindy 85 92使用sep\s读取import pandas as pd df pd.read_csv(scores.txt, sep\s) print(df)输出name math english 0 Alice 90 88 1 Bob 78 95 2 Cindy 85 925.2 读取制表符分隔的 txt如果是制表符分隔直接指定sep\tdf pd.read_csv(scores_tab.txt, sep\t)5.3 写入 txt同样使用to_csv指定分隔符为制表符df.to_csv(scores_output.txt, sep\t, indexFalse)这样就完成了 DataFrame 到 txt 的转换。6. 完整实战案例从读取、清洗到写出下面用一个完整流程演示read_csv和to_csv的常见组合用法。假设你从业务系统拿到一份user_data.csv包含姓名、城市、手机号、年龄、注册日期、备注等字段数据中存在乱码、缺失值、手机号前导零丢失等典型问题。6.1 分步实现准备工作import pandas as pd # 1. 读取文件注意编码和中文字段 df pd.read_csv( user_data.csv, encodinggbk, dtype{手机号: str}, parse_dates[注册日期], na_values[-, 未知, NULL] ) # 2. 过滤无效行 df df.dropna(subset[姓名]) # 3. 数据清洗年龄非数字设置为 NaN df[年龄] pd.to_numeric(df[年龄], errorscoerce) # 4. 删除不需要的列 df df.drop(columns[备注]) # 5. 写出为 utf-8-sig 编码Excel 可直接打开 df.to_csv(user_data_clean.csv, indexFalse, encodingutf-8-sig)6.2 演示数据与运行结果为了直接运行先生成一份有问题的测试文件import pandas as pd df_demo pd.DataFrame({ 姓名: [张三, 李四, 王五], 城市: [北京, 上海, 未知], 手机号: [13812345678, 13987654321, 13712345678], 年龄: [25, 三十, 40], 注册日期: [2021-01-15, 2022-06-01, 2023-03-20], 备注: [VIP, 普通, -] }) df_demo.to_csv(user_data.csv, indexFalse, encodinggbk)然后执行清洗代码最终输出user_data_clean.csv用 pandas 重新读取验证df_result pd.read_csv(user_data_clean.csv, encodingutf-8-sig) print(df_result)输出姓名 城市 手机号 年龄 注册日期 0 张三 北京 13812345678 25.0 2021-01-15 1 王五 广州 13712345678 40.0 2023-03-20可以看到“李四”因为年龄异常被转为NaN如果不小心把它也删除需要根据业务决定是否保留这里只是展示清洗逻辑。7. 常见问题与排查思路问题现象常见原因解决思路UnicodeDecodeError: utf-8 codec cant decode byte...文件编码不是 utf-8尝试encodinggbk或encodinggb18030读出来中文乱码编码指定错误或文件带 BOM使用encodingutf-8-sig读取列名变成Unnamed: 0写入时默认写了索引列读取时index_col0或写入时indexFalse手机号前导零丢失被自动解析为整数读取时指定dtype{手机号: str}ParserError: Error tokenizing data分隔符不正确或某行列数不一致检查sep参数必要时用error_bad_linesFalse日期列是字符串而不是日期类型没有指定parse_dates读取时添加parse_dates[列名]写出的 csv 用 Excel 打开乱码编码不是 utf-8-sig写出时使用encodingutf-8-sig大文件读取卡死或内存溢出一次性加载全部数据使用chunksize分块读取或只读部分列7.1 Python 3.10 与 pandas 版本适配部分读者是在 Python 3.10 或更高版本上安装 pandas如果遇到安装报错优先使用新版 pandaspip install --upgrade pandas如果项目环境受限可以先确认 Python 版本再安装对应版本但一般不必刻意锁定旧版本。7.2 pycharm 中安装 pandas 包在 PyCharm 中打开 Terminal执行pip install pandas或者在File - Settings - Project - Python Interpreter中点击加号搜索pandas安装。8. 最佳实践与工程建议8.1 规范文件编码团队协作时统一约定 CSV 文件编码为utf-8或utf-8-sig。如果你需要把文件交付给对方用 Excel 打开优先utf-8-sig如果后续由 Python 程序处理utf-8更常见。8.2 读取时尽量只保留需要的列usecols不只是省内存还能避免脏列干扰业务逻辑。例如df pd.read_csv(user_data.csv, usecols[姓名, 年龄, 手机号])8.3 明确指定 dtype不要依赖自动推断数字类型列如果可能超过 int64 范围或字段本身有前置补零需求都应显式指定str或合适的数值类型。8.4 大数据文件分块处理当文件超过几百 MB 时合理切分chunksize逐块处理后再合并写出chunk_list [] for chunk in pd.read_csv(large.csv, chunksize50000): chunk chunk.dropna(subset[关键列]) chunk_list.append(chunk) result pd.concat(chunk_list, ignore_indexTrue)8.5 写入大文件时的注意事项写入时使用indexFalse避免多余索引列。多次追加时注意headerFalse和modea。批量处理前先备份原文件尤其是覆盖写场景。如果程序中途失败可以先写入临时文件最后重命名避免留下半成品文件。8.6 数据清洗过程要保留审计信息在真实项目中建议把清洗前后的行数记录下来方便排查问题print(f读取数据{len(df)} 行) df_clean df.dropna(subset[姓名]) print(f清洗后{len(df_clean)} 行)9. 总结与下一步学习方向今天重点梳理了pd.read_csv和df.to_csv的核心参数包括分隔符、表头、索引列、编码、类型指定、日期解析、缺失值处理、分块读取等等。文本围绕 txt 和 csv 两种格式都给出了可运行的示例建议你照着代码先跑一遍再去拿一份真实的业务表练习usecols、dtype和encoding的组合使用。下一步可以继续学习DataFrame 的drop、fillna、astype等清洗操作。用pd.concat合并多个 csv 文件。用pd.merge关联多表数据。输出列顺序调整和格式化对应报表导出需求。如果这篇文章对你有帮助可以收藏备用后续遇到报错时对照排查。数据文件读写的核心就是“参数到位、编码清晰、类型明确”把这三个点牢牢记住读写环节会省下很多时间。

相关新闻

万岳在线教育系统源码V1.1.4部署与二次开发实战指南

万岳在线教育系统源码V1.1.4部署与二次开发实战指南

2026/9/3 2:16:23

简介:这是一套面向教育科技创业者、中小型培训机构及开发者的技术型开源解决方案,用于快速构建具备商业闭环能力的在线教育平台。资源基于万岳在线教育系统V1.1.4修复版源码,完整支持录播回看、网课购买、学习测试及多模式授课(大…

基于MATLAB/Simulink的无人机轨迹规划与动态避障仿真平台搭建指南

基于MATLAB/Simulink的无人机轨迹规划与动态避障仿真平台搭建指南

2026/9/3 2:16:23

简介:本资源是一套面向计算机、电子信息工程及数学等专业本科生的无人机轨迹与路径规划MATLAB仿真实验包,适用于课程设计、期末大作业及毕业设计等实践环节,聚焦多旋翼无人机动力学建模、轨迹生成与路径优化等核心问题。压缩包共7个文件&…

Grok Build v1.0.14 CLI可靠性升级:错误诊断与工作流稳定性实战

Grok Build v1.0.14 CLI可靠性升级:错误诊断与工作流稳定性实战

2026/9/3 2:16:23

Grok Build v1.0.14 这个版本最值得关注的,不是又加了什么惊艳功能,而是把目光放回了 CLI 可靠性、工作流执行稳定性这两个基础问题上。如果你平时只是在本机随手跑几条命令,可能感知不强;但如果你已经把它接进自动化脚本、CI 流水…

软件测试面试复盘:从工具使用到测试思维与工程能力的跃迁

软件测试面试复盘:从工具使用到测试思维与工程能力的跃迁

2026/9/3 3:16:29

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

技术选型不靠感觉:分布式定时任务多方案评估实战

技术选型不靠感觉:分布式定时任务多方案评估实战

2026/9/3 3:16:29

选择困难症在技术选型里并不新鲜。同一个目标,方案 A 性能表现最干净,方案 B 对周边生态最友好,方案 C 的运维负担最低,方案 D 是团队最早上手的路线。四个候选都有真实依据,评审会却很容易从技术分析滑向观点之争。第…

永磁同步电机FOC矢量控制与SVPWM仿真调参实战指南

永磁同步电机FOC矢量控制与SVPWM仿真调参实战指南

2026/9/3 3:16:28

简介:面向电气工程学生、研究人员与电机控制工程师,这份资源系统讲解现代永磁同步电机(PMSM)控制原理,并配有完整MATLAB仿真工程。核心控制策略,包括电压空间矢量调制(SVM)、直接转矩…

量子计算开发入门:从量子比特原理到Qiskit实战应用

量子计算开发入门:从量子比特原理到Qiskit实战应用

2026/9/3 3:16:28

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Cobalt Strike 4.7实战指南:从Beacon部署到检测规避

Cobalt Strike 4.7实战指南:从Beacon部署到检测规避

2026/9/3 3:16:28

简介:Cobalt Strike 4.7 是面向网络安全评估人员与渗透测试工程师的高级 C2 框架,用于模拟攻击者行为、验证组织防御体系的有效性。这份资源包共 9 个文件,压缩后约 136.34MB,涵盖核心 jar 程序、teamserver 服务端启动脚本、认证…

STM32睡眠监测仪:PPG+温度双模态嵌入式实现

STM32睡眠监测仪:PPG+温度双模态嵌入式实现

2026/9/3 3:06:28

简介:本资源是一套基于STM32微控制器开发的睡眠质量检测仪完整嵌入式项目工程,面向嵌入式初学者、电子类课程设计学生及健康监测类毕设开发者,解决睡眠生理参数采集、多源数据融合分析与睡眠阶段判别等典型物联网应用问题。压缩包含172个文件…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/9/2 10:08:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/9/2 12:11:52

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/9/1 23:49:08

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

【原创】基于微信小程序+AI大模型+uni-app的宠物用品商城小程序(设计与实现)

【原创】基于微信小程序+AI大模型+uni-app的宠物用品商城小程序(设计与实现)

2026/9/3 0:06:18

摘要:随着电子商务与本地生活服务的普及,线上交易与店铺运营管理已成为常规业态。传统分散式进销存与人工对账方式存在流程割裂、库存难同步、促销规则难落地、经营数据难沉淀等弊端,难以支撑一体化的数字化运营。同类课题亦多见多商户在线商…

【原创】基于AI大模型+SpringBoot+Vue的宠物用品商城(设计与实现)

【原创】基于AI大模型+SpringBoot+Vue的宠物用品商城(设计与实现)

2026/9/3 0:06:18

摘要:随着电子商务与本地生活服务的普及,线上交易与店铺运营管理已成为常规业态。传统分散式进销存与人工对账方式存在流程割裂、库存难同步、促销规则难落地、经营数据难沉淀等弊端,难以支撑一体化的数字化运营。同类课题亦多见多商户在线商…

【原创】基于微信小程序+AI大模型+uni-app的节日礼品定制商城小程序(设计与实现)

【原创】基于微信小程序+AI大模型+uni-app的节日礼品定制商城小程序(设计与实现)

2026/9/3 0:06:18

摘要:随着电子商务与本地生活服务的普及,线上交易与店铺运营管理已成为常规业态。传统分散式进销存与人工对账方式存在流程割裂、库存难同步、促销规则难落地、经营数据难沉淀等弊端,难以支撑一体化的数字化运营。同类课题亦多见多商户在线商…

远程协作的工作台整理

远程协作的工作台整理

2026/9/2 6:21:32

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/2 6:21:32

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/2 2:45:06

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…