You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在Pandas中使用read_fwf而非支持自定义分隔符的read_csv?

为什么要在Pandas中使用read_fwf?

我搞不懂在Pandas里用read_fwf的意义在哪——既然read_csv支持自定义分隔符,为啥还要用前者?我测试了两者处理大型固定列宽文件的速度,结果在我机器上read_csv快得多:

测试用文件生成代码

data = ("colum1    column2222   column3333   column4
"
        "id8141    360.242940   149.910199   11950.7
"
        "id1594    444.953632   166.985655   11788.4
"
        )

colspecs = [(0, 6), (8, 20), (21, 33), (34, 43)]
data = data * 10000000

with open("big_file.txt", "w") as f:
    f.write(data)

速度测试代码及结果

import time
import pandas as pd

start_time = time.time()
df = pd.read_csv("big_file.txt", header=None, dtype={"colum1": str, "column2222": float, "column3333": float, "column4":float}, sep="\s+")
print(f"--- {time.time() - start_time} seconds ---")
# --- 4.0295188426971436 seconds ---

start_time = time.time()
df = pd.read_fwf("big_file.txt", header=None, colspecs=colspecs, 
                 dtype={"colum1": str, "column2222": float, "column3333": float, "column4":float})
print(f"--- {time.time() - start_time} seconds ---")
# --- 77.41955280303955 seconds ---

解答:read_fwf的不可替代性

你的测试案例刚好是列内容不含空格、列之间用空格分隔的理想情况,这时候read_csv用\s+作为分隔符确实能正常解析,而且速度更快。但在很多真实场景中,read_fwf是无可替代的:

  • 列内容包含空格:比如某列是人名(如John Doe),固定宽度为10个字符,这时候如果用read_csv按空格分隔,会把人名拆成两列,而read_fwf能严格按列的起止位置提取内容,不会出错。
  • 无明确分隔符的固定宽度文件:有些固定列宽文件的列之间没有空格或其他分隔符,完全靠字符位置区分(比如第1-5位是ID,第6-15位是金额,第16-25位是日期),这种场景下read_csv根本无法正确解析,必须用read_fwf指定colspecs来分割。
  • 严格对齐的格式化文件:比如一些系统导出的报表、日志文件,是按固定列宽对齐排版的,用read_fwf能精准匹配原始格式的列划分,避免因分隔符识别错误导致的数据错乱。

简单来说,read_csv适合有明确分隔符的文件,而read_fwf是专门为**固定宽度无分隔符(或分隔符不可靠)**的文件设计的,两者的适用场景完全不同。你的测试只是刚好踩中了read_csv能兼容的固定宽度场景,但这不是固定宽度文件的全部情况。

内容的提问来源于stack exchange,提问作者An Ignorant Wanderer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:40:37