UnicodeDecodeError: (кодек utf-8) при чтении CSV-файла

то, что я пытаюсь, это прочитать csv, чтобы создать кадр данных --- внести изменения в столбец --- снова обновить/отражать измененное значение в тот же csv (to_csv) - снова попытаться прочитать этот csv, чтобы создать другой кадр данных... там я получаю сообщение об ошибке

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

мой код

 import pandas as pd
 df = pd.read_csv("D:\ss.csv")
 df.columns  #o/p is Index(['CUSTOMER_MAILID', 'False', 'True'], dtype='object')
 df['True'] = df['True'] + 2     #making changes to one column of type float
 df.to_csv("D:\ss.csv")       #updating that .csv    
 df1 = pd.read_csv("D:\ss.csv")   #again trying to read that csv

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

Поэтому, пожалуйста, предложите, как я могу избежать ошибки и снова прочитать этот csv в кадре данных.

Я знаю, что где-то мне не хватает «кодировать = какой-то тип кодека» или «декодировать = какой-то тип» при чтении и записи в csv.

Но я не знаю, что именно нужно изменить, поэтому нужна помощь.


person Satya    schedule 20.11.2015    source источник


Ответы (6)


Известная кодировка

Если вы знаете кодировку файла, который хотите прочитать, вы можете использовать

pd.read_csv('filename.txt', encoding='encoding')

Вот возможные кодировки: https://docs.python.org/3/library/codecs.html#standard-encodings

Неизвестная кодировка

Если вы не знаете кодировку, вы можете попробовать использовать chardet, однако это не гарантирует работу. Это больше догадки.

import chardet
import pandas as pd

with open('filename.csv', 'rb') as f:
    result = chardet.detect(f.read())  # or readline if the file is large


pd.read_csv('filename.csv', encoding=result['encoding'])
person MaxNoe    schedule 20.11.2015
comment
чтобы импортировать chardet, мне нужно будет установить какой-либо пакет? потому что я получаю сообщение об ошибке при импорте этого модуля. имя пакета пожалуйста.Спасибо - person Satya; 20.11.2015
comment
Да, pip install chardet. - person MaxNoe; 20.11.2015
comment
chardet.detect() работает очень медленно. Я использую Python 3.6, и pd.read_csv('filename.csv', encoding='Latin-1') отлично подходит для меня. - person Jun Wang; 03.01.2018
comment
Если вы знаете кодировку, всегда лучше указать ее. Если вы не знаете, и ваш файл большой, вы можете попробовать дать chardet не полный файл f.read (), а меньшую часть, например. f.read(1024**2) за первый мегабайт. - person MaxNoe; 03.01.2018
comment
Да, это также решило мою аналогичную проблему. - person bruce; 15.03.2019

Эта ошибка возникает при первом чтении данных или при втором чтении после того, как вы их записали и снова прочитали? Я предполагаю, что на самом деле это происходит при первом чтении данных, потому что ваш CSV имеет кодировку, отличную от UTF-8.

Попробуйте открыть этот CSV-файл в Notepad++, Excel или LibreOffice. Есть ли в вашем источнике данных символ ç (C с седильей)? Если это так, то байт 0xE7, который вы видите, вероятно, является ç, закодированным либо в Latin-1, либо в Windows-1252 (называемый «cp1252» в Python).

Глядя на документацию для Pandas read_csv(), я вижу, что у нее есть параметр encoding, который должен быть именем кодировки, в которой, как вы ожидаете, будет находиться файл CSV. Поэтому попробуйте добавить encoding="cp1252" к вашему вызову read_csv() следующим образом:

df = pd.read_csv(r"D:\ss.csv", encoding="cp1252")

Обратите внимание, что я добавил символ r перед именем файла, так что это будет считаться «необработанной строкой», а обратная косая черта не будет обрабатываться особым образом. Таким образом, вы не удивитесь, когда измените имя файла с ss.csv на new-ss.csv, где строка D:\new-ss.csv будет читаться как D, :, символ новой строки, e, w и т. д.

В любом случае, попробуйте этот параметр кодирования при первом вызове read_csv() и посмотрите, работает ли он. (Это всего лишь предположение, так как я не знаю ваших фактических данных. Если файл данных не является частным и не слишком велик, попробуйте опубликовать файл данных, чтобы мы могли увидеть его содержимое — это позволит нам работать лучше. чем просто гадать)

person rmunn    schedule 20.11.2015
comment
Спасибо, как вы можете видеть, мое первое чтение не дает мне никакой ошибки, также to_csv является успешным. Но ошибка возникает при попытке второго чтения. Может быть, когда я пытаюсь сохранить этот csv с помощью to_csv, я должен дать некоторое encdoe или декодировать введите так, чтобы во время моего второго чтения я мог читать с тем же типом кодировки. пожалуйста, поправьте меня. - person Satya; 20.11.2015
comment
@Satya - функция to_csv также принимает параметр encoding, поэтому вы также можете попробовать указать to_csv(filename, encoding="utf-8") (я настоятельно рекомендую везде использовать UTF-8 в качестве кодировки, если у вас есть выбор), прежде чем читать ее с read_csv(filename, encoding="utf-8"). Но поскольку UTF-8 уже используется по умолчанию, я не знаю, будет ли это иметь большое значение. - person rmunn; 20.11.2015
comment
@Satya - На самом деле, я только что ошибся. Если вы используете Python 3, UTF-8 используется по умолчанию для to_csv. Но если вы используете Python 2, это НЕ значение по умолчанию, поэтому добавление параметра encoding="utf-8" ко всем вашим вызовам to_csv() определенно является хорошей идеей. - person rmunn; 20.11.2015
comment
@rmunn-я использую python 3.4.1 и попробовал 1-е чтение с кодировкой = 'utf-8', затем to_csv с кодировкой = 'utf-8' и во 2-м чтении с кодировкой = 'utf-8',,,,, все еще получаю ту же ошибку при втором чтении. Пожалуйста, исправьте меня, если я должен использовать UTF-8. - person Satya; 20.11.2015
comment
@Satya - Вы действительно, ДЕЙСТВИТЕЛЬНО уверены, что это второе чтение не удалось? Потому что нет причин для сбоя, и если это действительно 1-е чтение, которое терпит неудачу, вы получите то же сообщение об ошибке. Возможно, все это время у вас был плохой входной файл, и вы не знали об этом. Я бы посоветовал вам поместить строку print("First read was successful") в свой код после первого вызова read_csv, а затем убедиться, что вы действительно видите эти слова в выводе. Просто чтобы быть действительно, ДЕЙСТВИТЕЛЬНО уверенным. - person rmunn; 20.11.2015
comment
@rmunn-да, на самом деле это был плохой файл. Я исправил это с помощью nodepad ++, и спасибо, ваш совет помог мне лучше. И еще одно -- когда используется decoding = 'utf-8' при работе с csv или используется только со строками. - person Satya; 20.11.2015

Одним из простых решений является то, что вы можете открыть файл csv в редакторе, таком как Sublime Text, и сохранить его в кодировке «utf-8». Тогда мы можем легко прочитать файл через pandas.

person Krishnaa    schedule 05.04.2016
comment
Однозначно самый простой :) - person mrGreenBrown; 27.01.2017
comment
ох вау попробовал это, и это сработало для меня. Спасибо - person Led; 03.02.2021

Да, вы получите эту ошибку. У меня есть решение этой проблемы, открыв CSV-файл в блокноте ++ и изменив кодировку через меню «Кодировка» -> преобразовать в UTF-8. Затем сохраните файл. Затем снова запустите программу python.

Другим решением является использование модуля кодеков в python для кодирования-декодирования файлов. Я не использовал это.

person Mangu Singh Rajpurohit    schedule 20.11.2015

Вышеупомянутый метод, используемый для импорта, а затем определения типа файла, работает с импортом charde

import pandas as pd
import chardet
with open('filename.csv', 'rb') as f:
    result = chardet.detect(f.read())  # or readline if the file is large


pd.read_csv('filename.csv', encoding=result['encoding'])
person Abhishek    schedule 10.06.2017
comment
Я использовал приведенный выше код и получил эту ошибку UnicodeDecodeError: кодек 'charmap' не может декодировать байт 0x8d в позиции 5356: сопоставление символов с ‹undefined› - person Mona Jalal; 01.04.2018

Я новичок в питоне. Столкнулся именно с этой проблемой, когда вручную изменил расширение своего файла excel на .csv и попытался прочитать его с помощью read_csv. Однако, если бы я открыл файл excel и сохранил его как файл csv, он, похоже, работал.

person Matt    schedule 24.03.2017