CSV 阅读器在前几个字符中拾取垃圾
Posted
技术标签:
【中文标题】CSV 阅读器在前几个字符中拾取垃圾【英文标题】:CSV reader picks up garbage in the first few characters 【发布时间】:2018-09-07 15:33:37 【问题描述】:我正在尝试读取 CSV 文件的第一行并将其分配给 header
。 CSV 文件如下所示:
TIME,DAY,MONTH,YEAR
"3:21","23","FEB","2018"
"3:23","23","FEB","2018"
...
代码如下:
import csv
with open("20180223.csv") as csvfile:
rdr = csv.reader(csvfile)
header = next(rdr)
print(header)
我希望输出看起来像:
['TIME', 'DAY', 'MONTH', 'YEAR']
但是输出看起来像这样:
['TIME', 'DAY', 'MONTH', 'YEAR']
我错过了什么?
【问题讨论】:
【参考方案1】:在 php 中,您可以这样做来消除此字节顺序标记,因为您确定它存在:
$ss = substr(file_get_contents('/path/to/file.csv'), 3);
【讨论】:
【参考方案2】:第一个字符是Byte order mark 字符。
试试这个:
with open("20180223.csv", encoding="utf-8-sig") as csvfile:
这条建议有点隐藏在documentation 中,但确实存在:
在某些地区,还习惯于在开头使用“BOM” UTF-8 编码文件;该名称具有误导性,因为 UTF-8 不是 字节顺序相关。该标记只是宣布该文件是 以 UTF-8 编码。使用“utf-8-sig”编解码器自动跳过 标记是否存在以读取此类文件。
【讨论】:
"utf-8-sig"中的"sig"是"signature"的缩写(即签名utf-8文件)。使用 utf-8-sig 读取文件会将 BOM 视为文件信息。而不是一个字符串。以上是关于CSV 阅读器在前几个字符中拾取垃圾的主要内容,如果未能解决你的问题,请参考以下文章