十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

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关联多表数据。输出列顺序调整和格式化对应报表导出需求。如果这篇文章对你有帮助可以收藏备用后续遇到报错时对照排查。数据文件读写的核心就是“参数到位、编码清晰、类型明确”把这三个点牢牢记住读写环节会省下很多时间。
返回列表