使用utf-8-sig BOM和latin-1编码将CSV文件读入python

时间:2019-12-13 20:24:10

标签: python python-3.x pandas encoding utf-8

我有一个csv文件,它似乎是根据文件开头存在的BOM表以UTF-8编码的。但是,当我尝试打开它时,出现错误

import io
import chardet
from zipfile import ZipFile
from pandas import read_csv

filename = './sample.zip'

objs = []
frames = []

with ZipFile(filename) as zf:
    zipinfo_objs = [ zi for zi in zf.infolist() 
        if zi.filename.endswith(".csv") ]

    for zipinfo_obj in zipinfo_objs:
        obj = zf.read(zipinfo_obj.filename)
        objs.append(obj)

    print("Bytes Objects:", [type(obj) for obj in objs])
    print("Encoding:", chardet.detect(objs[0]))
    print("BOM:", objs[0][:4])

    buffer = io.BytesIO(objs[0])
    frame = read_csv(buffer)
    frames.append(frame)

收益

Bytes Objects: [<class 'bytes'>]
Encoding: {'encoding': 'UTF-8-SIG', 'confidence': 1.0, 'language': ''}
BOM: b'\xef\xbb\xbf"'

...
...

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf3 in position 12: invalid continuation byte

但是,如果我尝试对缓冲区进行解码时将编码指定为latin-1,例如: frame = read_csv(buffer, encoding="latin-1")。 我获得了成功,熊猫能够在数据框中读取数据。

此文件是从Adobe Analytics生成的,显然,除了为用户提供选择CSV或Tableau文件的选项之外,没有其他选项可以指定导出的格式。

我的问题是:

  • 在latin-1中对CSV文件进行编码并在文件的开头包含UTF-8-SIG BOM是一种常见的情况吗?
  • 我应该检查编码是否不同/提取数据是否不同吗?

0 个答案:

没有答案