Ошибка при чтении CSV-файла в кодировке ascii?

#python-3.x #pandas #csv #encoding #ascii

#python-3.x #pandas #csv #кодирование #ascii

Вопрос:

У меня есть CSV-файл с именем Qid-NamedEntityMapping.csv, содержащий такие данные:

 Q1000070    b'Myron V. George'
Q1000296    b'Fred (footballer, born 1979)'
Q1000799    b'Herbert Greenfield'
Q1000841    b'Stephen A. Northway'
Q1001203    b'Buddy Greco'
Q100122     b'Kurt Kreuger'
Q1001240    b'Buddy Lester'
Q1001867    b'Fyodor Stravinsky'
  

Второй столбец закодирован в кодировке ascii, и когда я читаю файл, используя следующий код, он также не читается должным образом:

 import chardet
import pandas as pd

def find_encoding(fname):
    r_file = open(fname, 'rb').read()
    result = chardet.detect(r_file)
    charenc = result['encoding']
    return charenc


my_encoding = find_encoding('datasets/KGfacts/Qid- 
NamedEntityMapping.csv')
df = pd.read_csv('datasets/KGfacts/Qid- 
NamedEntityMapping.csv',error_bad_lines=False, encoding=my_encoding)
  

Но результат выглядит следующим образом:
вывод

Кроме того, я пытался использовать encoding =’UTF-8′. но, тем не менее, результат тот же. Что можно сделать, чтобы прочитать его правильно?

Комментарии:

1. Пожалуйста, не размещайте ссылки. Включите исходные данные в текстовую форму. Чтобы ответить на ваш вопрос, нам нужно увидеть реальные данные, а не скриншот. Похоже, у вас есть файл, разделенный табуляцией (TSV); для начала передайте sep='t' в программу чтения.

2. Извините, у меня недостаточно баллов для прямой публикации изображения. Я использовал sep = ‘ t’, но и теперь закодированная часть все еще там.

3. Не размещайте изображение, размещайте фактические данные в виде текста. Что-то, что можно скопировать и вставить.

4. Я пытался скопировать текст, но преобразовал в само изображение и поместил на него ссылку. Я могу вставить содержимое в комментарий, но оно также состоит из одной строки. Я публикую содержимое в следующем комментарии, если вам нужно.

5. Но, пожалуйста, вставьте это в вопрос вместо бесполезного изображения.

Ответ №1:

Похоже, у вас неправильно сохраненный файл TSV. Как только вы обойдете проблему с табуляцией (как предложено в моем комментарии), вы можете преобразовать столбец с именами в более подходящее представление.

Давайте предположим, что второй столбец фрейма данных называется «имена». b'XXX' Дело, вероятно, в байтовом [неправильном] представлении строки. Преобразуйте его в bytes объект с помощью ast.literal_eval , а затем декодируйте в строку:

 import ast
df["names"].apply(ast.literal_eval).apply(bytes.decode)
#0    Myron...
#1    Fred...
  

И последнее, но не менее важное: ваша проблема почти не имеет ничего общего с кодировками или кодировочными наборами.

Ответ №2:

Ваша проблема выглядит так, как будто CSV на самом деле разделен табуляцией; поэтому вам нужно иметь sep='t' в read_csv функции. Все остальное читается в виде одного столбца, за исключением «родился в 1979 году» в первой строке, поскольку это единственная ячейка с запятой в ней.

Комментарии:

1. Я сделал то, что вы сказали. Это решило половину проблемы. Часть кодирования по-прежнему находится во втором столбце.