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-файлах, и множество связанных с этим вопросов здесь, на SO.
самое простое из всех решений:
- откройте файл csv в возвышенный текстовый редактор.
- сохраните файл в формате UTF-8.
в sublime нажмите Файл - > Сохранить с кодировкой - > UTF-8
затем вы можете прочитать файл как обычно:
import pandas as pd
data = pd.read_csv('file_name.csv', encoding='utf-8')
EDIT 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, и который содержит некоторые строки с другая кодировка. Pandas не имеет специального положения для обработки ошибок, но Python
open
функция имеет (предполагая Python3), иread_csv
принимает файл как объект. Типичный параметр ошибки для использования здесь'ignore'
который просто подавляет оскорбительные байты или (ИМХО лучше)'backslashreplace'
который заменяет оскорбительные байты обратной косой escape-последовательностью Python: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. Очевидно в ретроспективе, но тонкие ошибки отследить.