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部署与二次开发实战指南

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

2026/9/4 3:52:36 阅读更多 →
基于MATLAB/Simulink的无人机轨迹规划与动态避障仿真平台搭建指南

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

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

2026/9/3 2:15:45 阅读更多 →
基于YOLOv8的小样本公路落石检测:从282张图像到工程化模型

基于YOLOv8的小样本公路落石检测:从282张图像到工程化模型

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

2026/9/4 2:41:05 阅读更多 →

最新新闻

DeepSeek Harness 解析:从 API 接入到编码代理配置

DeepSeek Harness 解析:从 API 接入到编码代理配置

最近社区里关于 DeepSeek Harness 即将发布的消息讨论度很高,不少开发者把它和 DeepSeek 官方产品、Hermes 项目甚至模型版本混在一起,越传越玄。代码仓库还没正式公开、文档也没有完整铺开的时候,最容易被各种“抢先体验包”和二手教程误导。…

2026/9/4 3:52:40 阅读更多 →
Netty与Disruptor整合架构:构建百万级高并发长连接服务

Netty与Disruptor整合架构:构建百万级高并发长连接服务

简介:本资源是一套面向中高级Java后端开发者与分布式系统学习者的实战型源码解析包,聚焦高并发场景下百万级长连接服务的架构设计与落地难点。通过深度整合Netty网络框架与Disruptor无锁事件队列,解决海量连接管理、低延迟消息分发及业务逻辑…

2026/9/4 3:52:40 阅读更多 →
AT89C51驱动步进电机Proteus仿真:ULN2003与28BYJ-48实战指南

AT89C51驱动步进电机Proteus仿真:ULN2003与28BYJ-48实战指南

简介:本资源是一套基于AT89C51单片机控制步进电机的完整Proteus仿真工程,面向嵌入式初学者、自动化控制课程设计者及单片机实训人员,解决电机驱动电路设计、多按键交互逻辑与LCD状态反馈等典型实践问题。压缩包共17个文件,含Prote…

2026/9/4 3:52:40 阅读更多 →
工业视觉相机软触发与参数控制实战:从曝光增益到实时采集

工业视觉相机软触发与参数控制实战:从曝光增益到实时采集

简介:本资源是一套基于C#开发的OPT工业相机控制完整工程,面向图像处理、机器视觉及自动化检测领域的初中级开发者,解决Windows平台下相机实时采集、软触发控制与关键参数动态调节等核心问题。压缩包共69个文件,包含9个核心DLL&…

2026/9/4 3:52:40 阅读更多 →
工业相机软触发与参数控制实战:从曝光增益到OPT SDK编程

工业相机软触发与参数控制实战:从曝光增益到OPT SDK编程

简介:本资源是一套基于C#开发的OPT相机控制完整工程,面向工业视觉、科研图像采集等领域的开发者与自动化工程师,解决相机实时采集、软触发同步、曝光/增益参数动态调节及生命周期管理等核心控制问题。压缩包共69个文件,包含9个关键…

2026/9/4 3:52:40 阅读更多 →
LangChain与MCP实战:从FastMCP到Agent工具调用拦截器

LangChain与MCP实战:从FastMCP到Agent工具调用拦截器

先问一个问题:你看到的 AI Agent 大多数还停留在“能聊天、能写诗”的阶段,而真正有价值的是让大模型去执行任务。可是大模型本身不会操作你的 API、不会查你的数据库、不会调用你项目里的工具,它只会“说话”。为了让模型安全、统一、低成本…

2026/9/4 3:51:40 阅读更多 →

日新闻

ESP32S2嵌入式收音机全栈开发实战指南

ESP32S2嵌入式收音机全栈开发实战指南

简介:本资源是一个基于ESP32-S2芯片的嵌入式综合实践项目,面向本科毕业设计、课程设计及实训开发人员,聚焦网络收音机与FM收音机双模功能实现,融合ESP-IDF框架、ESP-ADF音频开发库与LVGL图形界面库,具备完整软硬件协同…

2026/9/4 0:00:28 阅读更多 →
WorkBuddy+Python实战:从零搭建商品库存管理系统

WorkBuddy+Python实战:从零搭建商品库存管理系统

最近想自己动手做一个“商品库存管理系统”的人变多了。很多开网店、做小团队ERP选型、或者刚学Python的读者,不是不想用系统,而是被传统开发路径劝退了:要装数据库,要写后端接口,要学前端页面,还要考虑多人…

2026/9/4 0:00:28 阅读更多 →
旅游情感分析:基于Python的垂直场景深度解析

旅游情感分析:基于Python的垂直场景深度解析

简介:本资源是一份面向计算机专业本科生的毕业设计实践项目,聚焦旅游行业真实场景,解决旅游平台对用户评论情感倾向自动识别与管理的需求。系统基于Python 3.9.11与Anaconda环境构建,集成携程、马蜂窝双平台爬虫模块,并…

2026/9/4 0:00:28 阅读更多 →

周新闻

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

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

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

2026/9/3 4:22:22 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

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

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

2026/9/3 4:22:01 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

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

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

2026/9/3 4:22:59 阅读更多 →

月新闻

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

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

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

2026/9/3 4:17:49 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

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

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

2026/9/3 4:18:56 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/3 4:21:44 阅读更多 →