【问题标题】:UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 7601: ordinal not in range(128)UnicodeDecodeError:“ascii”编解码器无法解码位置 7601 中的字节 0xc3:序数不在范围内(128)
【发布时间】:2016-11-04 05:48:57
【问题描述】:

我目前正在运行:Python 3.5.1 :: Anaconda 4.0.0 (x86_64)。

错误:UnicodeDecodeError:“ascii”编解码器无法解码位置 7601 中的字节 0xc3:序数不在范围内 (128)

运行以下代码时,出现上述错误。当我保存并尝试从本地直接打开 txt 文件时,我遇到了同样的错误,但是,当我保存并运行副本时,我按预期将运行缩短到约 25 行 - 任何指导将不胜感激.

import numpy as np
import matplotlib.pyplot as pp
import seaborn
import urllib.request


urllib.request.urlretrieve('ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/daily/ghcnd-stations.txt','stations.txt')

print(open('stations.txt','r').readlines()[:10])

【问题讨论】:

  • 您是否检查了文件使用的编码?我确信 NOAA 在某处指定了这一点。然后在打开文件时使用该编码。
  • 另外,如果只需要前10行,不要先读整个文件;这是一个大文件。 from itertools import islice,然后lines = list(islice(openfileobj, 10)) 会为您提供打开文件对象的前 10 行,而无需读取其余部分。
  • 只打印前 10 行以查看它是否正常工作,因为它是一个大文件。
  • 我很好奇为什么如果我删除文件的大部分代码将运行(即如果我删除所有 txt 文件到 50 行然后打印前 10 行它会工作,但不是当文件已满时)——某些行的编码是否可能与 txt 中的其他行不同?
  • 在 ipython 中一切正常,但是,当我尝试在 sublime 文本中运行时,效果不一样

标签: python python-3.5 python-unicode urldecode


【解决方案1】:

不幸的是,documentation for that directory 没有指定文件使用的编解码器,所以我以二进制模式打开文件,发现导致“冒犯”的字节。

数据被编码为UTF-8;您遇到的“违规”字节拼写出 ESPAñOLA:

>>> line
b'US1NMRA0022  36.0456 -106.1517 1955.0 NM ESPA\xc3\xb1OLA 5.4 WNW                           \n'
>>> line.decode('utf8')
'US1NMRA0022  36.0456 -106.1517 1955.0 NM ESPAñOLA 5.4 WNW                           \n'

这是文件中的第 63815 行,如果您好奇的话,这就是为什么您在截断文件时看不到这个问题。

使用该编解码器打开文件:

open('stations.txt', 'r', encoding='utf8')

不要依赖默认值,这取决于您的语言环境(很容易因环境而异)。

【讨论】:

  • 效果很好,需要加编码层!
猜你喜欢
  • 2014-08-19
  • 2015-05-05
  • 2016-11-12
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
相关资源
最近更新 更多