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 阅读器在前几个字符中拾取垃圾的主要内容,如果未能解决你的问题,请参考以下文章

oo第三单元总结

从多个csv中提取列名前几个字符的列

无和空字符串的 CSV 阅读器行为

JVM垃圾回收阅读笔记

《UML大战需求分析》阅读笔记06

解析单个 CSV 字符串?