csv.reader报“line contains null byte”错误是因为文件含\x00空字节,常见于二进制文件误作文本打开、utf-16保存或日志截断;需用rb模式读取、replace(b'\x00', b'')过滤后再decode和stringio处理。

为什么 csv.reader 会报 “line contains NULL byte” 错误?
这个错误不是 CSV 格式问题,而是文件里混入了 \x00(空字节),常见于二进制文件被当作文本打开、Windows 记事本另存为 UTF-16、或日志被截断写入。Python 的 csv 模块底层用 C 实现,遇到 \x00 直接抛异常,不支持跳过或替换。
用 open() 预处理文件内容再喂给 csv.reader
最稳妥的做法是先读取原始字节,过滤掉 \x00,再解码为字符串交给 csv 处理。注意必须用 rb 模式打开,否则文本模式会提前报错。
- 用
open('file.csv', 'rb')读取全部字节 - 用
.replace(b'\x00', b'')去掉空字节(不能用字符串方法,因为还没解码) - 再用
.decode('utf-8')(或实际编码)转成字符串 - 最后用
io.StringIO()包装成类文件对象传给csv.reader
import csv
import io
with open('data.csv', 'rb') as f:
content = f.read().replace(b'\x00', b'')
text = content.decode('utf-8')
reader = csv.reader(io.StringIO(text))
for row in reader:
print(row)
用 pandas.read_csv 更省事但要注意参数
如果项目已依赖 pandas,它默认容忍空字节(底层用 Python 实现的解析器),但需显式关掉 C 引擎,否则仍可能报错:
- 必须加
engine='python',否则默认engine='c'会复现原错误 - 若文件编码非 UTF-8,要加
encoding参数(如encoding='gbk') - 空字节会被静默忽略,不会报错,但字段值里若有
\x00会被清空 —— 这通常就是你想要的
import pandas as pd
df = pd.read_csv('data.csv', engine='python', encoding='utf-8')
避免问题:从源头防止 NULL byte 写入 CSV
如果是你自己生成的 CSV 文件,务必检查数据源是否含二进制内容。尤其注意:
- 数据库字段类型为
BLOB或BYTEA时,不要直接拼进 CSV 字符串 - 用
base64.b64encode()编码二进制字段,而不是直接 str() 转换 - Windows 上用记事本保存 CSV 时,选“ANSI”或“UTF-8 无 BOM”,别选“UTF-16”
- 日志管道写入 CSV 时,确保上游没把二进制 dump 混进来(比如调试时打印了
repr(obj)但 obj 含 \x00)
空字节本身不可见,排查时用 xxd data.csv | head 或 Python 中 open('f','rb').read(20) 查看原始字节,比盯着报错更直接。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











