常见错误是glob路径写错导致读空,应确认工作目录、用绝对路径或os.path.abspath;concat易索引重复、列序乱、类型变object,需ignore_index=true、统一列序和显式dtype;大文件需chunksize分块读、指定engine和usecols;日期列须read_csv时parse_dates,避免合并后转类型失败。

用 glob 找文件时路径通配符写错,结果读空了
常见错误是直接写 "data/*.csv" 却没确认当前工作目录——glob 不认相对路径里的“上级目录”或用户主目录缩写(比如 ~/data)。它只做字面匹配,不展开 shell 特性。
- 用
os.path.abspath("data/*.csv")或直接写绝对路径更稳 - 先跑一遍
glob.glob("data/*.csv")打印结果,确认列表非空再进下一步 - Windows 下注意反斜杠:推荐统一用正斜杠
"data/*.csv"或双反斜杠"data\*.csv",避免转义问题
pandas.concat() 合并时索引重复、列顺序乱、类型自动转成 object
默认 concat 不重置索引,也不校验列名顺序;如果各 CSV 列名相同但顺序不同(比如有的是 ["a", "b"],有的是 ["b", "a"]),合并后列会按首次出现顺序排,后续文件对应字段可能错位。
- 加参数
ignore_index=True避免索引堆叠 - 强制统一列顺序:读取单个文件后用
df = df[expected_columns],其中expected_columns是你确认过的标准列序 - 加
dtype=object或逐列指定类型(如dtype={"id": "int64", "name": "string"}),防止某一个文件里某列有空值导致整列升为object
内存撑爆或读太慢:大文件不能无脑 pd.read_csv() 全读
10 个 500MB 的 CSV 一起读,concat 前就得占 5GB+ 内存;而且 read_csv 默认用 Python 引擎解析,对含特殊分隔符或换行的文本极慢。
- 用
chunksize分块读:把每个文件拆成小块,边读边concat,再清空变量(del chunk+gc.collect()) - 显式指定引擎:
engine="c"(默认)比engine="python"快 2–5 倍;有复杂引号/换行时才切回 python 引擎 - 跳过不需要的列:
usecols=["id", "amount", "date"]能省大量内存和 IO 时间
合并后时间列变字符串?parse_dates 必须在单次 read_csv 里生效
concat 不会帮你重新解析日期——如果某个 CSV 的 order_time 列读进来是 object,合并后还是 object,哪怕你之后调 pd.to_datetime() 也得全量转换,还可能报错。
- 所有
read_csv()调用必须带parse_dates=["order_time"],不能留到合并后统一转 - 加上
infer_datetime_format=True可提速 2–3 倍(前提是格式真的一致,比如全是"2023-01-01") - 遇到格式混杂(如部分为空、部分带时分秒),宁可先用
dtype="string"读入,再用pd.to_datetime(..., errors="coerce")统一处理
最麻烦的其实是隐式类型推断差异:同一个列名,在不同文件里可能被 pandas 自动判成 int64、float64 或 object。这种不一致不会报错,但后续 groupby 或计算时突然崩掉。得在读每一份时就锁死 dtype,别信默认。










