Python技术迷

如何使用 Pandas 读取 CSV 文件?

说到用 Pandas 读取 CSV 文件,乍一听可能觉得没啥技术含量,不就是 read_csv() 吗?但兄弟们,真要在生产环境里搞这玩意儿,还真不是你 pip 安装 pandas 然后一句 pd.read_csv("xxx.csv") 就能完事的。尤其是你要处理的数据要么上 G,要么编码千奇百怪,要么结构一锅粥,稍有不慎就等着线上爆雷吧 🧨。

讲真,Pandas 的 read_csv() 看似简单,背后能踩的坑和可优化的点,比你写个 for 循环多太多了。我今天就聊聊我在项目里用 read_csv 这玩意儿踩过的坑、用过的骚操作,还有一些“你以为你知道其实你不知道”的使用细节。

先甩个最基本的:

import pandas as pd

df = pd.read_csv("data.csv")

行了,文章可以收尾了🤡。

不是开玩笑的,说实话,如果你只是这么用,那你跟“初级实习生”真没差几分了。我们来点硬的。

我上个项目是跑一个日志分析系统,每天凌晨要 ingest 大概几十 GB 的 CSV 日志数据,数据长啥样呢?一列里又是逗号又是引号,有的甚至用 UTF-16 编的,最离谱的一次是日志文件头两行是注释,第三行才是 header。我当时一脸懵逼,心想:这不纯纯恶意吗?但说白了,这种场景下 read_csv 的参数你不熟,那就是自找苦吃。

比如处理这种 header 不在第一行的,你得这么整:

df = pd.read_csv("log.csv", header=2)

如果你忘了加 header=2,那 pandas 默认就把前两行数据当 header 了,然后你处理数据的时候一个列名找不到,一个类型识别错,debug 都能吐血。

还有 encoding 的问题。有一次我们拿到一个日本供应商传过来的 CSV,正常打开是乱码,一开始我以为是文件坏了,后来一查是 Shift_JIS 编的:

df = pd.read_csv("japan_data.csv", encoding="shift_jis")

讲真的,别老迷信 UTF-8,全世界人民都用 UTF-8 那是你的想象,现实是五花八门。Pandas 默认 encoding 是 UTF-8,文件一旦不是,直接 UnicodeDecodeError,跑都跑不了。

再比如 separator,CSV 文件的分隔符你以为就逗号?呵,现实啪啪打脸。项目里遇到过用分号(;)、Tab(\t)甚至 | 的,特别是银行那边的数据最喜欢用 | 分隔,理由是字段里可能包含逗号和分号。

df = pd.read_csv("bank_data.csv", sep="|")

别小看这个 sep 参数,搞不对就是全表一列。

说到性能优化,兄弟们你们还在直接读整个文件?那你真得考虑下公司是不是太有钱了💸。我以前读一个10G的 CSV 文件,结果机器直接卡死,后来搞清楚了几个点:

  1. 指定数据类型 dtype:

Pandas 默认推断类型,这个过程又慢又不靠谱。我们那次读日志的时候明明 IP 地址是字符串,结果 pandas 推成 float,把 192.168.1.1 直接变成了 NaN。

df = pd.read_csv("big.csv", dtype={"ip": str, "port": int})
  1. 只读需要的列 usecols:

你真的用得上那50列吗?我赌你只看了其中5列,其他全是白读,浪费 I/O:

df = pd.read_csv("huge.csv", usecols=["timestamp", "ip", "status"])
  1. 按块读取 chunksize:

这个是我最推荐的做法。特别是做 ETL、批处理的时候,直接流式读:

chunks = pd.read_csv("huge.csv", chunksize=10000)
for chunk in chunks:
# 数据处理逻辑
    process(chunk)

你别小看这个操作,chunksize 一开,内存占用瞬间下降不止一个量级,脚本稳定得像块石头。

还有一个我特别想说的坑:缺失值。

兄弟们知道吗?read_csv 默认会把 'NA', 'N/A', '#N/A' 等值当成 NaN。如果你文件里真的有一列叫 'NA' 表示省份缩写,你猜会怎样?全变成缺失值了 🤦‍♂️。

你得这么搞:

df = pd.read_csv("state_data.csv", keep_default_na=False)

或者你自定义 NaN:

df = pd.read_csv("weird.csv", na_values=["", "null", "NULL"])

再讲一个离谱的事,我们之前搞了个自动数据检测工具,结果一堆数据报错,原因是有些 CSV 文件开头带了 UTF-8 的 BOM(Byte Order Mark),导致第一列列名多了三个不可见字符……我当时调了半天代码才发现这个事。

后来查到解决方案:

df = pd.read_csv("bom_file.csv", encoding="utf-8-sig")

这个 utf-8-sig 就是干掉 BOM 的好工具。

当然你也可以直接干掉 pandas,去用 csv 模块手撸,但我劝你清醒点,不是所有事情都值得“手工打造”。你写的处理逻辑最后还得转成 DataFrame,那不如直接用 pandas,掌握点高级用法,效率才是王道。

最后给大家一个“吃灰利器”👇:

import pandas as pd

try:
    df = pd.read_csv("data.csv", 
                     encoding="utf-8-sig", 
                     dtype=str,
                     na_values=["", "null", "NULL"], 
                     usecols=["id", "name", "age"],
                     chunksize=10000)
for chunk in df:
        print(chunk.head())
except Exception as e:
    print("文件读取失败:", e)

我不吹,这一段代码基本能抗住 90% 的奇葩 CSV 文件,剩下的 10%,你就看运气和甲方心情了 😅。

总的来说,read_csv() 是 Pandas 里的“钉子户”,几乎所有 ETL、数据分析都离不开它,但你真别把它当成小白接口。这玩意儿坑多得跟大厂的晋升答辩一样,一不小心就被怼出局。

如果你还在用最原始的 pd.read_csv("xxx.csv"),不妨今天就试试加点料,你会发现这个 API 原来还能这么猛 💪。

行,就说到这。你们谁还有踩过的坑,评论区见

最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek

对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
🔥虎哥私藏精品 热门推荐🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,全部免费领取