'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
也就是latin1
。 r.text
将是正确解码的文本。
我正在尝试下载并解析 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
也就是latin1
。 r.text
将是正确解码的文本。