2016-07-01 5 views
0

Я в настоящее время работает: Python 3.5.1 :: Anaconda 4.0.0 (x86_64).UnicodeDecodeError: кодек 'ascii' не может декодировать байт 0xc3 в позиции 7601: порядковый не в диапазоне (128)

ОШИБКА: UnicodeDecodeError: «ASCII» кодек не может декодировать байт 0xC3 в позиции 7601: порядковый не в диапазоне (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]) 
+2

Вы проверили, какая кодировка была использована для файла? Я уверен, что NOAA указывает это где-то. Затем используйте эту кодировку при открытии файла. –

+0

Кроме того, если вам нужны только первые 10 строк, сначала не читайте весь файл; это большой файл. 'from itertools import islice', то' lines = list (islice (openfileobj, 10)) 'даст вам первые 10 строк открытого файлового объекта, не читая остальное. –

+0

Был напечатан только первые 10 строк, чтобы убедиться, что он работает правильно, так как это большой файл. –

ответ

2

К сожалению, documentation for that directory не определяет, какой кодек используется для файлов, так что я открыл файл в двоичном режиме, а и нашел байты, которые вызвали «преступление».

Данные кодируются как UTF-8; «оскорбительный» байт вы столкнулись заклинание из Эспаньола:

>>> 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' 

Это 63815th строки в файле, если вам интересно, поэтому вы не видите этот вопрос, когда вы усечь файл.

Откройте файл с этим кодеком:

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

Не следует полагаться на значения по умолчанию, который зависит от вашего местоположения (который легко отличается от среды к среде).

+0

Это сработало отлично, нужно добавить слой кодирования! –