#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. Я сделал то, что вы сказали. Это решило половину проблемы. Часть кодирования по-прежнему находится во втором столбце.