UnicodeDecodeError при чтении CSV-файла в панд с Python
Я запускаю программу, которая обрабатывает 30 000 подобных файлов. Случайное число из них останавливаются и производят эту ошибку...
File "C:Importersrcdfmanimporter.py", line 26, in import_chr
data = pd.read_csv(filepath, names=fields)
File "C:Python33libsite-packagespandasioparsers.py", line 400, in parser_f
return _read(filepath_or_buffer, kwds)
File "C:Python33libsite-packagespandasioparsers.py", line 205, in _read
return parser.read()
File "C:Python33libsite-packagespandasioparsers.py", line 608, in read
ret = self._engine.read(nrows)
File "C:Python33libsite-packagespandasioparsers.py", line 1028, in read
data = self._reader.read(nrows)
File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandasparser.c:6745)
File "parser.pyx", line 728, in pandas.parser.TextReader._read_low_memory (pandasparser.c:6964)
File "parser.pyx", line 804, in pandas.parser.TextReader._read_rows (pandasparser.c:7780)
File "parser.pyx", line 890, in pandas.parser.TextReader._convert_column_data (pandasparser.c:8793)
File "parser.pyx", line 950, in pandas.parser.TextReader._convert_tokens (pandasparser.c:9484)
File "parser.pyx", line 1026, in pandas.parser.TextReader._convert_with_dtype (pandasparser.c:10642)
File "parser.pyx", line 1046, in pandas.parser.TextReader._string_convert (pandasparser.c:10853)
File "parser.pyx", line 1278, in pandas.parser._string_box_utf8 (pandasparser.c:15657)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 6: invalid continuation byte
источник / создание этих файлов все приходят из одного и того же места. Каков наилучший способ исправить это, чтобы продолжить импорт?
4 ответов:
read_csvпринимаетencodingвозможность работы с файлами в разных форматах. Я в основном используюread_csv('file', encoding = "ISO-8859-1")илиencoding = "utf-8"для чтения, и вообщеutf-8наto_csv.вы также можете использовать псевдоним
'latin1'вместо'ISO-8859-1'.посмотреть соответствующая документация панды, примеры документов python в csv-файлах и много вопросов здесь на так.
самое простое из всех решений:
- откройте файл csv в возвышенный текстовый редактор.
- сохраните файл в формате UTF-8.
в sublime нажмите File - > Save with encoding - > UTF-8
затем вы можете прочитать файл как обычно:
import pandas as pd data = pd.read_csv('file_name.csv', encoding='utf-8')редактировать 1:
Если есть много файлов, то вы можете пропустить возвышенный шаг.
просто прочитайте файл с помощью
data = pd.read_csv('file_name.csv', encoding='utf-8')и другие различные типы кодирования:
encoding = "cp1252" encoding = "ISO-8859-1"
Pandas позволяет указать кодировку, но не позволяет игнорировать ошибки, чтобы автоматически не заменять нарушающие байты. Так что нет один размер подходит всем метод, но разными способами в зависимости от фактического использования.
вы знаете кодировку, и в файле нет ошибки кодирования. Отлично: вам нужно просто указать кодировку:
file_encoding = 'cp1252' # set file_encoding to the file encoding (utf8, latin1, etc.) pd.read_csv(input_file_and_path, ..., encoding=file_encoding)вы не хотите, чтобы вас беспокоили вопросы кодирования, и только хочу, чтобы этот проклятый файл загружался, независимо от того, содержат ли некоторые текстовые поля мусор. Хорошо, вы только должны использовать
Latin1кодировка, потому что она принимает любой возможный байт в качестве входного (и преобразует его в символ Юникода того же кода):pd.read_csv(input_file_and_path, ..., encoding='latin1')вы знаете, что большая часть файла записывается в определенной кодировке, но он также содержит ошибки кодирования. Примером реального мира является файл UTF8, который был отредактирован с помощью редактора, отличного от utf8, и который содержит некоторые строки с другая кодировка. Панды не имеет никакого положения для специальной обработки ошибок, но Python
openфункция имеет (предполагая Python3), иread_csvпринимает файл как объект. Типичные ошибки параметр для использования здесь'ignore'который просто подавляет оскорбительные байты или (ИМХО лучше)'backslashreplace'который заменяет оскорбительные байты их Python с обратной косой чертой escape-последовательности:file_encoding = 'utf8' # set file_encoding to the file encoding (utf8, latin1, etc.) input_fd = open(input_file_and_path, encoding=file_encoding, errors = 'backslashreplace') pd.read_csv(input_fd, ...)
боролся с этим некоторое время и думал, что я отправлю на этот вопрос, так как это первый результат поиска. Добавление тега encoding='iso-8859-1" в pandas read_csv не работало, как и любая другая кодировка, продолжало давать UnicodeDecodeError.
Если вы передаете дескриптор файла в pd.read_csv (), вам нужно поместить атрибут encoding= в файл open, а не в read_csv. Очевидно задним числом, но тонкая ошибка, чтобы выследить.
Comments