看到一个以 .csv 结尾的文件,并不能直接确定它的编码、分隔符和字段含义。比起立即清洗,先用小样本确认读取方式,能避免后面的步骤建立在错误的数据上。
编码:能够打开不代表没有问题
如果来源明确声明为 UTF-8,可以按约定读取。部分带有字节顺序标记的文件,使用 utf-8-sig 读取可以去掉文件开头的标记。遇到解码错误时,应先确认来源编码,不建议直接忽略错误字符。
分隔符与换行
逗号、分号和制表符都可能出现在导出数据里。字段内部也可能包含逗号和换行,因此不要简单地按逗号拆分每一行。使用 CSV 解析器,并按来源约定指定分隔符。
import csv
from pathlib import Path
path = Path("sample.csv")
with path.open(encoding="utf-8-sig", newline="") as handle:
reader = csv.DictReader(handle)
print("字段:", reader.fieldnames)
for index, row in enumerate(reader):
if index == 5:
break
print(row)表头:检查重复与空格
读取后先打印字段名,检查是否存在前后空格、空字段或重复名称。尤其是重复表头,可能导致字段映射时丢失信息。遇到问题应先修正表头约定,再处理整份文件。
空值:先理解,再转换
空字符串、零、“无”和“不适用”可能表达不同含义。编号和电话号码即使只包含数字,也不应随意转换为数值,否则可能丢掉开头的零。清洗规则应记录下来,原始文件则单独保留。
先检查读取结果,再写清洗逻辑;先保留原始数据,再生成处理后的新文件。