'invalid continuation byte'- 具有多种编码的 csv?

'invalid continuation byte'- csv with multiple encodings?

我正在尝试下载并解析 python 中的 U.S. Census csv 文件。我收到重复出现的错误,表明文件中有多种编码。

我使用

获得了文件编码
import urllib.request 
import io
url = 'https://www2.census.gov/programs-surveys/popest/datasets/2010-2019/metro/totals/csa-est2019-alldata.csv'
urllib.request.urlretrieve(url, 'data/source_files/census/city/2010.csv')

这给了我文件编码

io.open('data/source_files/census/city/2010.csv')

<_io.TextIOWrapper name='data/source_files/census/city/2010.csv' mode='r' encoding='UTF-8'>

但是编码好像不对?我尝试使用 chardet。

with open('data/source_files/census/city/2010.csv', encoding = 'UTF-8') as f:
    print(chardet.detect(f.read()))

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

无论我尝试什么,我都会收到一个类似的错误

df = pd.read_csv('data/source_files/census/city/' + '2010.csv')
import csv
with open("data/source_files/census/city/2010.csv","r") as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        print(row['CBSA'])

所有这些方法都给我这个错误:

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

关于如何解决这个问题有什么建议吗?

Latin-1 是一个单字节编码系列,因此其中的所有内容都应在 UTF-8 中定义。但有时 Latin-1 会获胜。

用这个,如果显示UTF-8错误

import pandas as pd

url = "https://www2.census.gov/programs-surveys/popest/datasets/2010-2019/metro/totals/csa-est2019-alldata.csv"

data = pd.read_csv(url , encoding='latin-1')
data.head()

它应该会显示以下数据。

CSV 文件似乎不是 UTF-8 编码的,因此您必须使用正确的选项来帮助文件包装器正确解码它。

在这种情况下,CSV 编码为 ANSI 而不是 UTF-8:

open("...", encoding="ANSI")

第一个代码没有获取编码,它只是下载文件。

第二个代码使用 OS 特定的默认编码打开文件,特别是 locale.getpreferredencoding(False) 的值。 UTF-8 是所用 OS 的默认值,它对文件不正确。

第三个代码再次打开文件为UTF-8,这是失败的原因,而不是chardet

改为使用 requests 库:

>>> import requests
>>> r=requests.get('https://www2.census.gov/programs-surveys/popest/datasets/2010-2019/metro/totals/csa-est2019-alldata.csv')
>>> r
<Response [200]>
>>> r.encoding
'ISO-8859-1'

正确的编码是ISO-8859-1也就是latin1r.text 将是正确解码的文本。