2017-02-10 2 views
0

Прошу прощения, если это похоже на дубликат сообщения, но я потратил 2 часа на поиск в stackoverflow и не нашел решения.Проблемы с файлами csv UFT-8, невозможно создать pandas df

Я загружаю файл csv в pandas и использую несколько столбцов для моего фреймворка. Проблема в том, что один из столбцов имеет символ степени в имени °.

Если я вручную удаляю o из csv, я могу загрузить в pandas без проблем. Тем не менее, у меня будет сотня этих файлов, так что ручное удаление не похоже на забаву.

Это ошибка я получаю:

"UnicodeDecodeError: кодек 'UTF-8' не может декодировать байт 0xb0 в положении 6: недопустимый начальный байт"

# coding: utf-8 
import googlemaps 
import folium 
import pandas as pd 
import re 

df = pd.read_csv('{}{}{}'.format(path, filename, '.csv', encoding='utf-8',errors="ignore")) 
        .rename(columns={'GPS_x[°]': 'lng', 'GPS_y[°]': 'lat', 
        'ELEVATION_FT[Ft]': 'ele_ft'}) 

Я попытался кодирования это как latin1/iso-8859-1 без успеха. Я использую Pycharm в качестве моей IDE, а кодировка по умолчанию - UTF-8.

Я также попытался открыть файл csv в блокноте ++ и кодировать его как UTP-8 и сохранить новый файл, все равно получить ту же ошибку. Я не уверен, что делать

EDIT 1: Traceback (самый последний вызов последнего):

File  "myfile.py", line 18, in <module> 
df = pd.read_csv('{}{}{}'.format(path, filename, '.csv', errors="ignore")).rename(columns={'GPS_x[°]': 'lng', 'GPS_y[°]': 'lat', 'ELEVATION_FT[Ft]': 'ele_ft'}) 

File "C:\Users\name\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 645, in parser_f 
return _read(filepath_or_buffer, kwds) 

File "C:\Users\name\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 388, in _read 
parser = TextFileReader(filepath_or_buffer, **kwds) 

File "C:\Users\name\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 729, in __init__ 
self._make_engine(self.engine) 

File "C:\Users\name\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 922, in _make_engine 
self._engine = CParserWrapper(self.f, **self.options) 

File "C:\Users\name\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 1389, in __init__ 
self._reader = _parser.TextReader(src, **kwds) 

File "pandas\parser.pyx", line 535, in pandas.parser.TextReader.__cinit__ (pandas\parser.c:6077) 

File "pandas\parser.pyx", line 738, in pandas.parser.TextReader._get_header (pandas\parser.c:9215) 

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 11: invalid start byte 
+0

Try кодирования = «cp1252» – Vaishali

+0

Спасибо за помощь Вайшали. К сожалению, cp1252 не работает. – Tappy

ответ

0

У вас есть несколько опечаток. Вы проходили encoding= до format(), а не read_csv(), который впоследствии был проигнорирован.

errors также ошибочно здесь, так как он не поддерживается read_csv.

Поскольку ваша кодировка сообщается как ANSI с помощью блокнота ++, вы должны использовать mbcs в качестве кодека. ANSI означает 8-битный набор символов вашего региона, например windows-1252, если вы настроены для Западной Европы. mbcs в Python использует тот же параметр области для декодирования/кодирования.

df = pd.read_csv('{}{}{}'.format(path, filename, '.csv'), encoding='mbcs').rename(columns={'GPS_x[°]': 'lng', 'GPS_y[°]': 'lat', 'ELEVATION_FT[Ft]': 'ele_ft'}) 

Для того, чтобы было легче читать, что, возможно, помогли вам найти проблему более быстро, вы должны сделать:

fq_filename = '{}{}{}'.format(path, filename, '.csv') 
df = pd.read_csv(fq_filename, encoding='mbcs') 
df = df.rename(columns={'GPS_x[°]': 'lng', 'GPS_y[°]': 'lat', 'ELEVATION_FT[Ft]': 'ele_ft'}) 
+0

Привет, Алистер. Я удалил символы степени из копии файла CSV, чтобы продолжить разработку приложения. После того, как я закончил писать, я попытался импортировать оригинальные csv с помощью символов степени в тактике, чтобы решить эту проблему в последний раз. IDE был настроен на UTF-8, а также говорит то же самое в углу ниже. Я также попытался # кодировать: utf-8 и latin1, как рекомендовано в других сообщениях. Теперь я попытался использовать блокнот ++ для кодирования csv в utf-8, а затем снова запустить сценарий. На этот раз он работает. Однако я не могу вручную перекодировать каждый из файлов csv, поэтому я застрял. – Tappy

+0

Ах, согласно документации, 'errors =' не является допустимым аргументом для 'read_csv'. Unaltered, какая кодировка делает блокнот ++, думаю, что ваш CSV-файл? –

+0

это просто говорит ANSI – Tappy

0

Этот код работал для меня:

df = pd.read_csv('your.csv',encoding ="latin1") 
Смежные вопросы