ARTICLE DETAIL

资讯详情

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

Pandas读写CSV/txt文件:read_csv与to_csv参数详解

Pandas读写CSV/txt文件:read_csv与to_csv参数详解 在实际数据处理项目中Pandas 读写 txt 和 csv 文件是最常见的一类操作。无论是业务系统导出的报表、爬虫落地的数据文件还是数据仓库中的中间表最终大多会以 CSV 或 txt 形式进入分析流程。很多初学者只调用pd.read_csv(file.csv)和df.to_csv(out.csv, indexFalse)就跑通了流程但一旦遇到中文乱码、列数错位、日期变成字符串、文件体积过大等问题就不知道该从哪个参数入手。本文围绕 Pandas 读写 txt 和 csv 文件展开重点拆解read_csv、to_csv的常用参数并用一组可复现的代码完成“读取、清洗、导出、复查”的完整闭环。读完后你可以应对大多数本地文件读写的场景也能在遇到解析类错误时快速定位原因。1. 先理解 read_csv 不只是为 CSV 设计的1.1 CSV 本质上是带分隔符的文本文件CSV 全称是 Comma-Separated Values理论上是用逗号分隔的表格数据。但在实际生产环境中这个“分隔符”并不固定Excel 导出经常用逗号部分老系统用分号日志文件用制表符爬虫清洗后的文本可能用多个空格。Pandas 的read_csv虽然名称里带 csv实际上它是一个通用文本文件读取接口通过sep参数可以读取几乎所有以字符为分隔符的表格文件。to_csv也一样它不只是写出“逗号分隔”的文件。把sep改成\t写出的就是 tab 分隔的 txt改成;写出的就是分号分隔文件。理解了这一层就不会在遇到 txt 时觉得需要另找一套 API。日常所说的“Pandas 读写 txt”本质上就是read_csv和to_csv配合不同分隔符最多再处理一下表头缺失、固定宽度等特殊场景。1.2 磁盘文件与 DataFrame 之间的映射关系读写文件的核心是搞清磁盘上一行文本如何映射成 DataFrame 的一行。默认情况下文件的第一行会作为列名也就是header0。文件中的数据行按分隔符拆成多个字段每一行变成 DataFrame 中的一行。分隔符是逗号所以1,张伟,男会拆成三列。如果某一列的内容本身包含分隔符需要加引号包裹例如1,张,伟,男此时read_csv默认的quotechar参数会处理这种引号。反过来当 DataFrame 写出到文件时to_csv会把每一行的索引和数据依次拼接成字符串默认用逗号分隔并自动给包含特殊字符的字段加引号。理解这些映射关系后很多参数就变得好记sep控制拆和拼的分隔符header控制表头从哪一行开始index控制 DataFrame 的行索引是否写入文件。1.3 read_csv 的默认推断机制read_csv一个很强大的功能是类型推断。读入文件时Pandas 会扫描每一列的数据自动判断它应该成为 int、float、object 还是 datetime。这个设计在大多数时候很好用但在某些场景会带来问题。例如订单号列内容是00123Pandas 看到它形似整数会读取成数字 123前导零直接丢失。再比如某列大部分时间是日期但有个别空值读取结果可能会变成类似2023-01-01 00:00:00的字符串而非 datetime 类型。因此实际项目中不要把类型推断当成“它一定懂我的数据”关键字段要主动使用dtype或parse_dates指定类型。这一点在后面参数拆解中会重点演示。2. 把 Python 环境准备好并用最小案例跑通读写闭环2.1 环境要求与安装方式Pandas 支持 Python 3.9 及以上版本主流新版本也兼容 Python 3.10、3.11、3.12。在动手之前先确认 Python 和 Pandas 已经安装python --version pip show pandas如果没有安装使用 pip 安装即可pip install pandas安装完成后用一行代码确认版本import pandas as pd print(pd.__version__)只要能打印出版本号就说明环境正常。Pandas 的 API 在多个版本间比较稳定本文涉及的参数在 Pandas 1.5、2.0、2.1、2.2 等版本中都可以使用但如果你使用的是非常古老的版本例如 0.x建议先升级到新版本再继续。2.2 创建一份可复现的测试数据文件为了让下面的参数演示有真实载体先构造一份模拟订单数据。文件采用 tab 分隔也就是 txt 格式包含订单号、产品、数量、价格、下单日期五个字段其中有一行故意缺了下单日期。lines [ order_id\tproduct\tquantity\tprice\torder_date, 1001\t鼠标\t3\t39.90\t2023/05/01, 1002\t键盘\t2\t129.00\t2023/05/03, 1003\t显示器\t1\t999.00\t, 1004\t耳机\t5\t199.00\t2023/05/10, ] with open(orders.txt, w, encodingutf-8) as f: f.write(\n.join(lines))这段代码会在当前目录生成orders.txt列之间是制表符。文件里的中文采用 UTF-8 编码在 Linux、macOS 上可以直接使用在 Windows 的某些编辑器中如果显示中文乱码改写成encodingutf-8-sig或encodinggbk都可以但只选择一个编码写入读取时也要对应。2.3 第一次读写闭环先跑通最基础的读写流程。先创建一个 DataFrame再写出为 CSV最后读取回来并比对结果import pandas as pd df pd.DataFrame({ name: [Alice, Bob, Charlie], age: [25, 30, 35], city: [Beijing, Shanghai, Guangzhou], }) df.to_csv(people.csv, indexFalse, encodingutf-8) restored pd.read_csv(people.csv, encodingutf-8) print(restored) print(restored.dtypes)预期输出大致如下name age city 0 Alice 25 Beijing 1 Bob 30 Shanghai 2 Charlie 35 Guangzhou name object age int64 city object dtype: object这个最小闭环证明to_csv能写出文件read_csv能读回文件且默认自动识别出了列名和类型。这里有一个细节要立刻提醒代码里写indexFalse是为了避免 DataFrame 的行索引0、1、2被写进文件否则重新读取后会出现一列Unnamed: 0。这是最常见的坑之一后面排查部分还会专门展开。注意不要只验证文件能生成还要把文件读回来检查列名、行数、类型是否符合预期。文件能打开不代表数据没被静默改写。3. read_csv 参数拆解从分隔符到类型推断3.1 分隔符相关参数sep是read_csv最常用的参数指定文件中用来拆分字段的字符。默认值是英文逗号但很多业务文件并不是逗号分隔。# 读取 tab 分隔文件 df_orders pd.read_csv(orders.txt, sep\t) print(df_orders.head())如果文件使用分号分隔比如部分地区生成的报表可以写成df_semi pd.read_csv(data_semicolon.csv, sep;)如果文件使用一个或多个空格分隔可以使用正则表达式\s。这里要注意正则中的反斜杠在 Python 字符串里需要写成r\s或\\sdf_space pd.read_csv(data_space.txt, sepr\s)有些旧教程会写delim_whitespaceTrue这个参数在新版本中已经不建议使用统一用sepr\s更稳妥。delimiter是sep的别名两者任选其一即可但不要同时传给函数否则会引发歧义。3.2 表头与行筛选参数header参数决定文件中的哪一行作为列名。默认是0表示第一行如果文件没有表头写成None。df_no_header pd.read_csv(data_no_header.csv, headerNone)读取没有表头的文件时列名会变成数字 0、1、2使用起来不方便所以通常配合names一起使用df_no_header pd.read_csv( data_no_header.csv, headerNone, names[id, name, amount], )skiprows用于跳过文件前几行。很多系统导出的文件顶部会有标题、空行或说明文字例如月度销售统计报表 生成日期2023-05-01 order_id,product,amount 1001,鼠标,119.7这种文件需要跳过前两行再让第三行成为表头df_report pd.read_csv(report.csv, skiprows2)如果只是想快速预览大型文件的前几行可以用nrows。它只读取指定行数能大幅减少 I/Opreview pd.read_csv(orders.txt, sep\t, nrows2) print(preview)这样只会读取前两行数据适合在拿到陌生文件时先观察结构再决定完整读入的参数。3.3 编码与数据类型参数编码问题在中文环境中几乎必然出现。read_csv默认使用 UTF-8如果文件是 GBK 编码不指定会报 UnicodeDecodeError。准确做法是先确认文件编码再显式传入df_gbk pd.read_csv(export_gbk.csv, encodinggbk)在某些编辑器或旧系统中UTF-8 文件可能带 BOM 头读取时列名会出现\ufeff前缀。这种情况可以写成df_utf8_bom pd.read_csv(export_utf8_bom.csv, encodingutf-8-sig)dtype参数用于固定列的读取类型。最常见的场景是 ID 列和代码列它们虽然由数字组成但本质上不是数值不能参与四则运算也不能丢失前导零df_orders pd.read_csv( orders.txt, sep\t, dtype{order_id: str}, )执行后order_id列会保持字符串类型1001不会变成 1001.0也不会丢失任何内容。商品编码、手机号、身份证号、股票代码这类列都应该考虑用dtype显式指定为str。3.4 列选择、索引与缺失值参数usecols可以在读取阶段只保留需要的列既减少内存占用也让后续代码更清晰df_sub pd.read_csv( orders.txt, sep\t, usecols[order_id, product, price], )index_col指定某一列作为 DataFrame 的行索引。如果文件本身就有一列主键例如订单号可以直接用它作为索引df_idx pd.read_csv( orders.txt, sep\t, index_colorder_id, )之后通过df_idx.loc[1001]就能直接定位到对应订单。na_values用于指定哪些值需要被识别为缺失值。默认情况下空字符串、NA、NaN、NULL等会被识别为缺失但不同系统有不同的空值写法例如Unknown、-等可以追加df_orders pd.read_csv( orders.txt, sep\t, na_values[, NA, NULL, -], )这样 Pandas 会把-也视为缺失值后续dropna、fillna处理起来更统一。3.5 综合实战读取并清洗一份带脏数据的订单 txt先把orders.txt生成的代码再确认一遍然后读取它处理缺失日期计算订单金额import pandas as pd df pd.read_csv( orders.txt, sep\t, header0, dtype{order_id: str}, na_values[, NA, NULL], ) df[order_date] pd.to_datetime( df[order_date], format%Y/%m/%d, errorscoerce, ) df[amount] df[quantity] * df[price] print(df) print(df.dtypes)预期输出order_id product quantity price order_date amount 0 1001 鼠标 3 39.9 2023-05-01 119.7 1 1002 键盘 2 129.0 2023-05-03 258.0 2 1003 显示器 1 999.0 NaT 999.0 3 1004 耳机 5 199.0 2023-05-10 995.0order_date列原本是没有parse_dates的字符串列这里用pd.to_datetime主动转换。重点在于format%Y/%m/%d它告诉 Pandas 原始日期是斜杠格式errorscoerce则让无法解析的值变成NaT而不是直接抛出异常导致脚本中断。对于第 2 行缺失日期的情况NaT就是缺失时间戳的标准表达后续可以针对它做过滤或填充。quantity和price相乘得到amount由于price是浮点类型amount自动成为浮点列。这个结果已经是一个干净的 DataFrame可以接着进入to_csv导出环节。注意解析日期时不要默认数据百分百干净建议带上errorscoerce否则一个格式异常就能让整条流水线崩溃。4. to_csv 参数拆解从路径到编码再到格式控制4.1 输出路径与分隔符to_csv的第一个参数是path_or_buf可以传文件路径字符串也可以传一个已打开的文件对象或io.StringIO。如果传路径Pandas 会直接创建文件如果传文件对象适合把 CSV 内容写入内存、通过 HTTP 返回或拼接到已有文件中。import io buffer io.StringIO() df.to_csv(buffer, indexFalse) csv_text buffer.getvalue() print(csv_text)sep参数同样控制输出的分隔符。如果想生成 Excel 能直接打开的文本文件可以用 tabdf.to_csv(orders.txt, sep\t, indexFalse)如果希望导出后保持 CSV 语义默认逗号就够。需要提醒的是如果某列数据本身包含分隔符或换行to_csv会自动用引号包裹这是正确行为读取端也应该让read_csv使用默认的quotechar不要手动删除引号。4.2 索引、表头与列筛选index是to_csv最容易踩坑的参数。默认值是True意味着会把行索引作为第一列输出。重新读取时这列没有列名Pandas 会命名为Unnamed: 0。# 错误示范把行索引也写进去了 df.to_csv(people_default_index.csv) # 推荐写法大多数业务场景不需要写行索引 df.to_csv(people.csv, indexFalse)header参数控制是否输出列名。如果目标文件要求无表头只追加纯数据可以写成headerFalse。columns参数用于只导出指定列并且可以调整输出顺序df_orders.to_csv( orders_export.csv, indexFalse, columns[order_id, product, amount, order_date], )这样最终文件不会包含quantity、price等中间列下游直接拿金额字段使用即可。4.3 编码、缺失值与浮点格式encoding参数控制写出文件的编码。UTF-8 是通用选择适合程序间交互如果文件需要交给 Windows 下的旧版 Excel 打开GBK 兼容性更好但要注意读取端必须使用相同编码。na_rep参数决定缺失值写成什么。默认是空字符串如果下游系统需要显式空值标记可以改成NULL或NAdf_orders.to_csv( orders_export.csv, indexFalse, encodingutf-8, na_repNULL, )float_format用于控制浮点数的显示格式。默认情况下Pandas 可能输出39.9但业务报表往往要求保留两位小数df_orders.to_csv( orders_export.csv, indexFalse, float_format%.2f, )这样金额列会输出为119.70、258.00、999.00、995.00。注意float_format只影响写出文本不影响内存中 DataFrame 的实际精度因此不用担心导出后计算失真。date_format参数用于格式化 datetime 列df_orders.to_csv( orders_export.csv, indexFalse, date_format%Y-%m-%d, )不加这个参数时日期列可能被写成2023-05-01也可能带时分秒。显式指定格式可以让输出结果更稳定。4.4 追加写入、分块与压缩modea可以将数据追加到已有文件末尾适合增量导出场景。但必须配合headerFalse否则每次追加都会重复写入表头new_orders pd.DataFrame({ order_id: [1005], product: [麦克风], quantity: [2], price: [259.00], order_date: [pd.Timestamp(2023-05-12)], amount: [518.00], }) new_orders.to_csv( orders_export.csv, modea, headerFalse, indexFalse, encodingutf-8, float_format%.2f, na_repNULL, )追加模式要求新数据的列顺序和原文件完全一致否则整行数据会错位。如果原文件字段顺序发生变化先对新 DataFrame 按原字段顺序重排再执行追加。compression参数支持在写出时直接压缩例如 gzipdf_orders.to_csv( orders_export.csv.gz, indexFalse, compressiongzip, )读回时同样指定compressiondf_from_gz pd.read_csv(orders_export.csv.gz, compressiongzip)chunksize参数则用于将大 DataFrame 分批次写出避免一次性构造超大字符串导致内存压力for i in range(0, len(df_orders), 1000): batch df_orders.iloc[i : i 1000] batch.to_csv( orders_batch.csv, modea, header(i 0), indexFalse, )首次写入带表头后续批次用headerFalse追加整体上就是把大表拆成多个小批次落地。4.5 实战把清洗结果导出并复查继续使用前面清洗过的df_orders执行一次正式导出df_orders.to_csv( orders_clean.csv, indexFalse, encodingutf-8, float_format%.2f, na_repNULL, date_format%Y-%m-%d, ) check pd.read_csv(orders_clean.csv, encodingutf-8) print(check)预期输出类似order_id product quantity price order_date amount 0 1001 鼠标 3 39.9 2023-05-01 119.70 1 1002 键盘 2 129.0 2023-05-03 258.00 2 1003 显示器 1 999.0 NULL 999.00 3 1004 耳机 5 199.0 2023-05-10 995.00这里有两个地方值得注意。第一price列读回来还是39.9而不是39.90因为float_format%.2f只影响文件里的文本read_csv读取时又恢复为浮点类型类型推断不会再保留小数点后两位。第二order_date列中存在NULL因此这一列重新读取后整体变成 object而不是 datetime。若下游需要日期类型读取时还要再指定parse_dates[order_date]或者先让原文件在导出前把缺失日期填充为真实日期。5. txt 文件处理差异制表符、空格、无表头和固定宽度5.1 制表符分隔的 txt 读取制表符文件是 txt 最常见的结构化形式。Excel 导出的 .txt 或 .tsv很多系统生成的报表都喜欢用 Tab 键把字段隔开。读取方式和 CSV 唯一区别是sep\tdf_tsv pd.read_csv(data.tsv, sep\t)写出的 txt 同样简单df_tsv.to_csv(data_copy.txt, sep\t, indexFalse)需要注意如果 txt 中某一字段本身包含 Tab 字符读取时同样会被拆成多列因此导出端应避免在字段中出现 Tab或者导出时用引号包裹字段内容。5.2 空格分隔与无表头 txt日志型数据经常用空格或多个空格分隔。比如2023-05-01 08:00:00 INFO user_login 1001 2023-05-01 08:05:00 INFO order_create 1002这种文件读取时用sepr\sdf_log pd.read_csv( app.log, sepr\s, headerNone, names[date, time, level, event, user_id], dtype{user_id: str}, )如果 txt 没有表头headerNone是必需项。否则第一行数据会被当成列名数据也就少了一行。配合names可以给每一列起好名字避免后续通过数字下标访问列。5.3 固定宽度文件用 read_fwf有些老系统或气象、金融领域的 txt 文件不用分隔符而是通过固定字符位置对齐字段。例如每行前 8 位是日期接下来 10 位是编号再后面 12 位是数值。这种文件不能靠sep分割应该用read_fwfdf_fwf pd.read_fwf( fixed_width.txt, widths[8, 10, 12], names[date, code, value], )read_fwf本质上也是文本表格读取方案与read_csv的参数体系高度相似只是用widths或colspecs替代sep。遇到字段靠对齐而非分隔符的 txt首选这个方法不要硬写正则去切字符串。5.4 txt 与 csv 导出的兼容性差异从数据内容看txt 和 csv 没有本质区别差异在于约定。CSV 通常默认带表头、逗号分隔txt 则可能没有表头分隔符也可能是制表符、空格或分号。如果把 txt 用to_csv(sep\t)导出下游必须知道这是 tab 分隔文件不能直接用 Excel 双击打开。如果希望文件能双击后在 Excel 中正确分列更稳妥的做法是导出成标准 CSV或者导出时明确告知下游使用“数据 - 自文本”导入并指定制表符。场景推荐读取方式推荐导出方式普通 CSV 文件read_csv(a.csv)to_csv(a.csv, indexFalse)tab 分隔 txtread_csv(a.txt, sep\t)to_csv(a.txt, sep\t, indexFalse)空格分隔文本read_csv(a.txt, sepr\s)建议转成 CSV 或 tab无表头 txtread_csv(a.txt, headerNone, names...)to_csv(a.txt, headerFalse, indexFalse)固定宽度 txtread_fwf(a.txt, widths[...])不推荐使用 to_csv 逆向生成固定宽度文件6. 高频报错与排查路径6.1 中文文件读取乱码或报 UnicodeDecodeError现象是读取文件时抛出类似UnicodeDecodeError: utf-8 codec cant decode byte 0xd3 in position 0: invalid continuation byte或者读出来中文变为乱码。根本原因是文件实际编码与指定编码不一致。UTF-8 文件被当成 GBK 读或者 GBK 文件被当成 UTF-8 读都会出现这个问题。排查顺序用记事本、VS Code 或 Notepad 打开文件查看右下角编码提示。在 Linux 或 macOS 上使用file -i orders.txt查看文件编码。分别尝试encodingutf-8、encodingutf-8-sig、encodinggbk。如果存在 BOM推荐utf-8-sig。预防建议项目内部统一使用 UTF-8 写出遇到外部文件先确认编码再做读取。6.2 ParserError数据行列数不一致现象是报错ParserError: Error tokenizing data. C error: Expected 3 fields in line 4, saw 5原因是某一行出现的分隔符数量与其他行不同。例如数据中包含中文逗号、未转义的引号、或字段里残留了换行符。排查顺序打开原始文件找到报错提到的那一行观察是否有多余分隔符。确认数据字段本身是否包含逗号如果包含应该用引号包裹。如果文件格式非常混乱不要指望read_csv完美解析先对源头数据做清洗。处理方式有两种。如果只是少量坏行可以用on_bad_linesskip跳过如果希望保留问题行可以用on_bad_lineswarn输出警告后跳过。df pd.read_csv(dirty.csv, on_bad_linesskip)但这种方式会静默丢弃数据生产环境要慎重。更推荐在数据进入 DataFrame 之前就定位并修复生成方的问题。6.3 追加写入后表头重复或列错位现象是使用modea多次追加后文件中出现多行表头或者追加的列对应不上原文件的字段。原因是追加时没有设置headerFalse或者新 DataFrame 的列顺序与原文件不一致。排查顺序打开文件确认前几行和追加位置的数据结构。对比新数据列名原文件列名。重读原文件列出列名列表再对新数据按相同顺序取列。处理方式original_columns pd.read_csv(orders_clean.csv, nrows1).columns.tolist() new_df new_df[original_columns] new_df.to_csv( orders_clean.csv, modea, headerFalse, indexFalse, )6.4 大文件读取时内存不足现象是读取几个 GB 的 CSV 时机器内存迅速吃满甚至抛出 MemoryError。原因是read_csv默认一次性把所有数据读入内存行数多、列多、类型推断不当时内存占用会被明显放大。排查顺序先观察文件行数和列数估算数据规模。使用usecols只读取需要的列。使用dtype固定类型避免 Pandas 反复探测。使用chunksize分块读取逐块处理。chunk_iter pd.read_csv( large.csv, chunksize10000, usecols[order_id, amount], dtype{order_id: str}, ) for chunk in chunk_iter: # 对每个分片做处理再合并或写入结果 print(chunk.shape)6.5 高频错误速查表异常或错误表现常见原因检查方式处理建议UnicodeDecodeError文件编码与指定编码不一致查看编辑器右下角编码或用file命令使用匹配的encodingBOM 文件用utf-8-sigParserError: Expected N fields行内分隔符数量不一致查看报错行附近内容修复源文件或使用on_bad_linesskip读取后出现Unnamed: 0列导出时写入了行索引查看文件第一列to_csv时加indexFalse手机号、订单号前导零丢失列被推断为数字类型打印dtypes查看列类型dtype{order_id: str}日期读取后是 object未解析日期或列中存在空值查看该列少数几个值使用parse_dates或pd.to_datetime追加写入后表头重复modea且headerTrue查看文件中间位置追加时设置headerFalse中文列名变成\ufeff开头文件带 BOM打印列名来看使用encodingutf-8-sig读取7. 生产环境最佳实践与扩展方向7.1 读写之前先确认文件元信息拿到一份陌生文件不要直接写完整读取逻辑。先花一分钟确认表头、分隔符、编码、行数这几个关键信息import pandas as pd # 只看前 3 行确认格式 pd.read_csv(unknown.csv, nrows3) # 无表头情况下查看分隔符效果 pd.read_csv(unknown.csv, headerNone, nrows3)也可以用 Python 内置的open先读取前几行文本人工确认分隔符with open(unknown.csv, r, encodingutf-8-sig) as f: for _ in range(3): print(repr(f.readline()))repr会把隐藏的 Tab、换行符显示出来适合快速判断到底是逗号分隔还是制表符分隔。7.2 生产环境的路径与异常处理生产环境不要硬编码绝对路径也不要假设当前工作目录一定正确。建议用pathlib.Path管理路径并把文件操作包裹在异常处理中from pathlib import Path import pandas as pd data_path Path(/data/orders/2023-05-01) / orders.txt try: df pd.read_csv(data_path, sep\t, encodingutf-8) except FileNotFoundError: print(f文件不存在: {data_path}) except pd.errors.ParserError as e: print(f文件解析失败: {e})写日志时记录文件路径、读取行数、列名和耗时方便后续审计。读取大型文件时考虑记录time.time()前后差值避免任务异常时无法定位到耗时瓶颈。7.3 落地前要检查的可复用清单每次读写文件前按清单做一轮确认可以降低大多数低级错误的发生概率。确认文件实际编码UTF-8、UTF-8 带 BOM、GBK。确认分隔符逗号、制表符、分号、空格。确认文件是否有表头表头在第几行。确认是否存在需要跳过的行例如说明、空行。确认订单号、手机号、编码等列是否要用字符串读取。确认日期列要不要统一成 datetime 类型。确认导出时是否需要写行索引。确认缺失值要写成空字符串、NA还是NULL。确认浮点数精度要求是否需要float_format。确认追加数据时列顺序与源文件一致。确认大文件是否需要chunksize分块处理。确认写完后能重新读回并抽查列数和类型不发生变化。7.4 扩展方向本文重点讲的是逗号、制表符、空格等分隔符文件的读写。实际工作中还有几个相关方向值得进一步掌握。第一个是 JSON 和 Excel 文件。pd.read_json、df.to_json、pd.read_excel、df.to_excel与 CSV 读写配合使用可以覆盖绝大多数数据交换场景。尤其是 Excel 文件企业报表经常要求从 CSV 汇总后统一导出成 Excel。第二个是数据库读写。pd.read_sql和df.to_sql可以直接在 DataFrame 与数据库表之间交换数据处理流程通常是从 CSV 读入原始数据清洗后写入数据库再定期导出结果文件。第三个是 Parquet 和 Arrow 等列式存储格式。当文件达到 GB 级别CSV 的读写速度和磁盘占用都不占优势Parquet 在类型保留、压缩率、读取速度上都有明显优势。可以先掌握 CSV再在数据规模增长后切换到 Parquet。第四个是流式处理和内存管理。read_csv的chunksize只是入门更系统的方案包括使用 Dask、Polars 或 PySpark 处理超大文件。不过这些框架的底层思路仍然包含本章讲的文本解析逻辑把read_csv的参数理解透彻迁移成本会低很多。一次完整的 CSV 文件读写价值不只是“把数据从磁盘搬到 DataFrame”。参数选对了可以避免乱码、错位、类型丢失和内存溢出选错了轻则多写几行补救代码重则产出数据错误进入下游报表和模型后很难排查。动手练习时建议把本文的orders.txt例子完整运行一遍再尝试改参数观察输出变化。这样理解到的不是函数签名而是 Pandas 在文件解析和文本生成时的真实行为。
返回列表