Как читать CSV-файлы (со специальными символами) в Python? Как я могу декодировать текстовые данные? Чтение закодированного текста из файла и преобразование в строку - PullRequest
0 голосов
/ 01 марта 2020

Я использовал tweepy для хранения текста твитов в файле csv с помощью Python csv.writer (), но мне пришлось кодировать текст в utf-8 перед сохранением, иначе tweepy выдает странную ошибку.

импорт pandas как pd

data = pd.read_csv ('C: \ Users \ Lenovo \ Desktop \ _Carabinieri_10_tweets.csv', delimiter = ",", encoding = "utf- 8 ")

data.head ()

print (data.head ())

Теперь текстовые данные сохраняются так:

ВЫХОД

id… text

0 1228280254256623616… b'RT @MinisteroDifesa: # 14febbraio Il Ministro…

1 1228257366841405441… b '\ xe2 \ x80 \ x9cn \ x80 \ x99ama chi amor ti…

2 1228235394954620928… b'Eseguite dai #Carabinieri del Nucleo Investi…

3 1228219588589965316… b'Il pianeta brucia \ nConosci il black carbon?

4 1228020579485261824… b'RT @Coninews: Emozioni tricolore \ xe2 \ x9c \ xa…

Хотя я использовал «utf-8» для чтения файла в DataFrame с кодом, показанным ниже, символы выглядят очень по-разному в выводе. вывод выглядит как байты. Язык итальянский.

Я попытался расшифровать это с помощью этого кода (в других столбцах больше данных, во втором столбце текст). Но это не расшифровывает текст. Я не могу использовать .decode ('utf-8'), так как читатель csv читает данные как строки, то есть тип (row [2]) равен 'str', и я не могу преобразовать его в байты, данные кодируются еще раз !

Как я могу декодировать текстовые данные?

Я был бы очень рад, если вы можете помочь с этим, заранее спасибо.

1 Ответ

1 голос
/ 02 марта 2020

Проблема, скорее всего, связана с тем, как вы написали свой CSV-файл. Я бы поспорил на монету, которая при чтении в виде текста (с помощью простого текстового редактора, такого как блокнот, блокнот ++ или vi) на самом деле содержит:

1228280254256623616,…,b'RT @MinisteroDifesa: #14febbraio Il Ministro...'
1228257366841405441,…,b'\xe2\x80\x9cNon t\xe2\x80\x99ama chi amor ti...'
...

или:

1228280254256623616,…,"b'RT @MinisteroDifesa: #14febbraio Il Ministro...'"
1228257366841405441,…,"b'\xe2\x80\x9cNon t\xe2\x80\x99ama chi amor ti...'"
...

Pandas read_csv затем корректно читает текстовое представление байтовой строки .

. Правильным решением было бы написать истинные строки в кодировке UTF-8, но, поскольку я не знаю код, я не могу предложить исправление.

Возможный обходной путь - использовать ast.literal_eval для преобразования текстового представления в байтовую строку и декодирования:

df['text'] = df['text'].apply(lambda x: ast.literal_eval(x).decode('utf8'))

Это должно дать:

                    id ... text
0  1228280254256623616 ... RT @MinisteroDifesa: #14febbraio Il Ministro...
1  1228257366841405441 ... “Non t’ama chi amor ti...
...
...