конвертирование байтов из твиттера в строки - PullRequest
0 голосов
/ 29 августа 2018

Я собираю твиты из Twitter и сохраняю текстовые данные в CSV-файле (который сохраняется как байтовый литерал b). При просмотре данных у меня есть много символов Unicode, таких как (\xe2\x80\x9c). Можно ли написать сценарий, который может пройти через CSV и декодировать все Unicode, или я должен декодировать его, когда я загружаю сообщения? Если можно пройти через CSV и декодировать Unicode, как мне это сделать?

Вот пример данных:

b'\xe2\x80\x9cSwitching Gears: Binance Phishing Scammers Pivot to EOS Airdrop Phishing Scam\xe2\x80\x9d by @satnam '
b'Go SMB! \xf0\x9f\x92\x95\xf0\x9f\x8d\xba'
b'@boogymaboi @SMB_DBN Trousers are too sick \xf0\x9f\x98\xa4'

EDIT: Текстовые записи в файле csv выглядят, как показано выше, при просмотре самого файла csv, при распечатывании их он показывает, что они являются строками, и показывает то же, что и выше, но в «b '\ xe2 \ x80 \ x9cSwitching Gears: Binance Phishing Scammers Поворот к EOS ". При создании файла я добавил записи в существующий CSV и написал с использованием x.writerow (текст)

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

with open('my.csv', 'wb') as file:

    with open('sec_tweet_dataset.csv') as f:
        for a in f:
            a = a.decode()
            data = a.rstrip()
            file.write(data)
            file.write('\n')

Я пробовал разные формы, но ни один из них не может правильно отобразить строку.

1 Ответ

0 голосов
/ 29 августа 2018

Чтобы декодировать объект bytes в строку, используйте метод decode:

b'\xe2\x80\x9cSwitching Gears: Binance Phishing Scammers Pivot to EOS Airdrop Phishing Scam\xe2\x80\x9d by @satnam '.decode('utf-8')
b'Go SMB! \xf0\x9f\x92\x95\xf0\x9f\x8d\xba'.decode('utf-8')
b'@boogymaboi @SMB_DBN Trousers are too sick \xf0\x9f\x98\xa4'.decode('utf-8')

В качестве альтернативы, вы можете записать файл в двоичном формате и прочитать его обратно как обычный текст UTF-8:

with open('my.csv', 'wb') as f:
    f.write(b'\xe2\x80\x9cSwitching Gears: Binance Phishing Scammers Pivot to EOS Airdrop Phishing Scam\xe2\x80\x9d by @satnam ')
    f.write(b'\n')
    f.write(b'Go SMB! \xf0\x9f\x92\x95\xf0\x9f\x8d\xba')
    f.write(b'\n')
    f.write(b'@boogymaboi @SMB_DBN Trousers are too sick \xf0\x9f\x98\xa4')

with open('my.csv') as f:
    data = [s.rstrip() for a in f]

В любом случае ваши три строки декодируются до

«Переключение механизмов: фишинг-мошенники Binance разворачиваются на фишинг-мошенничестве EOS Airdrop» @ satnam

Иди SMB! ??

@ boogymaboi @SMB_DBN Брюки слишком больны ?

Ключ в том, что ваши данные поступают уже в Unicode. Вы просто должны сказать Python об этом. И decode, и запись / чтение делают это. Первый просто интерпретирует байты как кодировку UTF-8 непосредственно в памяти. Последний записывает данные буквально в файл, а затем интерпретирует его как UTF-8, когда файл читается.

Просто убедитесь, что b находится в вашем файловом режиме, когда вы пишете. В противном случае объекты, которые вы пишете, в конечном итоге преобразуются в строку с использованием str вместо правильного декодирования, что приводит к получению файла, содержащего набор буквальных b s и escape-символов.

...