Доступ к содержимому Unicode из DataFrame возвращает содержимое Unicode с дополнительной обратной косой чертой в Python3 - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть файл CSV, который состоит из нескольких твитов, загруженных через API. Твиты состоят из нескольких символов Юникода, и у меня довольно хорошая идея, как их декодировать.

Я поместил файл CSV в DataFrame,

df = pd.read_csv('sample.csv', header=None)
columns = ['time', 'tweet']
df.columns = columns

один из твитов -

b'RT : This little girl dressed as her father for Halloween, a  employee \xf0\x9f\x98\x82\xf0\x9f\x98\x82\xf0\x9f\x91\x8c (via )'

Но когда я получаю доступ к этому твиту через команду - ДФ [ 'чирикать'] [0]

вывод возвращается в следующем формате -

"b'RT : This little girl dressed as her father for Halloween, a  employee \\xf0\\x9f\\x98\\x82\\xf0\\x9f\\x98\\x82\\xf0\\x9f\\x91\\x8c (via ) '"

Я не могу понять, почему этот дополнительный обратный слеш добавляется в твит. В результате этот контент не декодируется. Ниже приведены несколько строк из DataFrame.

      time                         tweet
0   2018-11-02 05:55:46        b'RT : This little girl dressed as her father for Halloween, a  employee \xf0\x9f\x98\x82\xf0\x9f\x98\x82\xf0\x9f\x91\x8c (via )'
1   2018-11-02 05:46:41        b'RT : This little girl dressed as her father for Halloween, a  employee \xf0\x9f\x98\x82\xf0\x9f\x98\x82\xf0\x9f\x91\x8c (via )'
2   2018-11-02 03:44:35        b'Like, you could use a line map that just shows the whole thing instead of showing a truncated map that\xe2\x80\x99s confusing.\xe2\x80\xa6 (via )
3   2018-11-02 03:37:03        b' service is a joke. No service northbound  No service northbound from Navy Yard after a playoff game at 11:30pm. And they\xe2\x80\xa6' 

Скриншот файла "sample.csv". enter image description here

Как я уже упоминал ранее, любой из этих твитов при прямом доступе будет иметь дополнительную обратную косую черту, которая будет добавлена ​​в вывод.

Может кто-нибудь объяснить, почему это происходит и как этого избежать?

спасибо

1 Ответ

0 голосов
/ 10 ноября 2018

Вы не показывали содержимое вашего CSV-файла, но похоже, что тот, кто его создал, записал «строковое представление объекта байтов, полученного из твитера», то есть внутри самого файла CSV вы найдете литерал b'\xff...' символов.

Итак, когда вы читаете его из Python, несмотря на то, что при печати в виде строки он выглядит как объект байтов (те, которые представлены с помощью b'...'), они представляют собой строку с этим представлением в качестве содержимого.

Один из способов вернуть их обратно в качестве правильных строк - просто позволить Python оценить свой контент - тогда они станут действительными байтовыми объектами, которые можно декодировать в текст. Всегда полезно использовать ast.literal_eval, так как eval слишком произвольный.

Итак, после загрузки данных в ваш фрейм данных это может исправить столбец твитов:

import ast

df['tweet'] = df['tweet'].map(lambda x: ast.literal_eval(x).decode('utf-8') if x.startswith("b'") else x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...