Не могу найти правильный кодек для чтения CSV - PullRequest
0 голосов
/ 04 июля 2019

Я читаю CSV-файл, это происходит из-за некоторых следов из сетевого протокола, шестнадцатеричных символов и обычного смешанного. Я пытаюсь прочитать .csv, и я пробовал несколько кодировок: utf-8, cp1252, latin1 ...

Для latin1 :

UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ xb0' в позиции 51: порядковый номер не в диапазоне (128)

Для utf-8 :

UnicodeDecodeError: кодек «utf8» не может декодировать байт 0xb0 в позиции 51: недопустимый начальный байт

Для cp1252 :

UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ xb0' в позиции 51: порядковый номер не в диапазоне (128)

Используемый код:

df=pd.read_csv(file,sep='`',error_bad_lines=False,encoding='cp1252',names=colnames,quotechar='"')

Я не большой специалист по кодированию, но я хотел бы знать, как решить эту проблему.

Узнать текущую кодировку файла CSV, который я читаю?

Существует ли очень разрешающий кодек, который принимает практически все?

Спасибо.

Ответы [ 3 ]

1 голос
/ 04 июля 2019

CSV - текстовый формат;он не очень подходит для хранения произвольных двоичных объектов двоичных данных.

Чтобы решить вашу непосредственную проблему, вы можете указать ´latin-1' в качестве кодировки.Этот кодек обладает уникальной особенностью, заключающейся в том, что каждый однобайтовый символ соответствует одной и той же кодовой точке Unicode.

Осторожно, однако, что это может привести к различным видам mojibake , если выне осторожныВам, вероятно, следует извлечь какие-либо двоичные данные, а затем как можно скорее декодировать оставшиеся поля в соответствующий Юникод.Вот простой чистый фрагмент Python для UTF-8 с одним полем, содержащим двоичный файл.

with open(filename, encoding='latin-1') as input:
    reader = csv.reader(input)
    for row in reader:
        binary = row[42].encode('latin-1')
        newrow = []
        for field in row:
            newrow.append(field.encode('latin-1').decode('utf-8'))
        newrow[42] = binary
        # newrow is now decoded UTF-8 except field 42 which is a bytes object
0 голосов
/ 04 июля 2019

для чтения CSV-файла

import csv
def unicode_csv_reader(utf8_data, dialect=csv.excel, **kwargs):
   csv_reader = csv.reader(utf8_data, dialect=dialect, **kwargs)
   for row in csv_reader:
      yield [unicode(cell, 'utf-8') for cell in row]
   filename = 'da.csv'
   reader = unicode_csv_reader(open(filename))
   for field1, field2, field3 in reader:
       print field1, field2, field3 
0 голосов
/ 04 июля 2019

Сначала выясните тип кодировки , затем используйте его для чтения

Чтобы найти тип кодировки:

Метод: 1 Вы можете просто открыть файл с помощью блокнота и затем перейти в Файл -> Сохранить как. Рядом с кнопкой Сохранить будет выпадающий список кодировки, и там будет выбрана текущая кодировка файла. Метод: 2 В системах Linux вы можете использовать команду file. Это даст правильную кодировку

    > file sub01.csv

sub01.csv: текст ASCII

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