使用unicodecsv模块读取CSV时首行出现\ufeff及解析异常的解决方案
问题根因
- 输出里的
\ufeff是UTF-8 BOM(字节顺序标记),是Windows平台部分编辑器保存UTF-8文件时,自动在文件头部追加的3字节标识位,不属于CSV的有效业务内容。 - 之前传入
encoding='utf8'不生效的原因是:标准utf-8编码规则不会自动识别、剥离开头的BOM,BOM会被解析为普通字符,附着在第一行内容的最前端。 - 由于BOM占据了第一行的起始位置,CSV解析器无法识别到行首的双引号是字段包裹符,直接按逗号规则拆分第一行,最终出现首行引号残留、字段拆分错误的现象。
修复方案
只需要将编码参数从utf8替换为utf-8-sig即可,该编码是Python内置的、专门适配带BOM的UTF-8文件的编码规则,会自动检测并丢弃文件开头的BOM标记,不会篡改正常业务内容,修改后的代码如下:
import unicodecsv CSV_PARAMS = dict( delimiter=",", quotechar='"', lineterminator='\n', encoding='utf-8-sig' # 替换为utf-8-sig自动处理BOM ) unireader = unicodecsv.reader(open('sample.csv', 'rb'), **CSV_PARAMS) for line in unireader: print(line)
运行验证
修改后执行代码,将得到符合预期的解析结果:
['003,word one'] ['003,word two'] ['003,word three']
注意:不要手动写字符串替换逻辑删除首行的
\ufeff,这种硬编码处理方式兼容性差,遇到无BOM的文件、或者BOM出现在非开头位置的异常文件时容易出现误删内容的问题,用utf-8-sig是官方推荐的标准处理方案。
内容的提问来源于stack exchange,提问作者Em Ae
相关产品推荐
相关产品推荐

