Как мне декодировать строки в 'utf-8'? - PullRequest
0 голосов
/ 30 декабря 2018

Я использую tweepy для захвата некоторых твитов на португальском языке и сохраняю эти твиты в файле csv.Весь текст твита сохраняется со специальными символами, и теперь я не могу затем преобразовать его в правильный формат.

Моя кодировка для захвата твита:

csvFile = open('ua.csv', 'a')
csvWriter = csv.writer(csvFile)
for tweet in tweepy.Cursor(api.user_timeline,id=usuario,count=10,
                           lang="en",
                           since="2018-12-01").items():
csvWriter.writerow([tweet.created_at, tweet.text.encode('utf-8')])

Я читаюрезультаты, как это:

test = pd.read_csv('ua.csv', header=None)
test.columns = ["date", "text"]
result = test['text'][0]
print(result)
'Aproveita essa promo\xc3\xa7\xc3\xa3o aqui!'

Результат, который мне нужен, должен быть таким:

print(result)
'Aproveita essa promoção aqui!'

Я пытался этот код для преобразования:

print(result.decode('utf-8'))

и получил этосообщение об ошибке:

AttributeError: 'str' object has no attribute 'decode'

Где я делаю не так?

Ответы [ 3 ]

0 голосов
/ 30 декабря 2018

Проблема в том, что вы создаете объект bytes, когда вы .encode пишите в твиттере, вам не нужно этого делать.

csv.writer объект будет принудительно связывать все, что вы передаете ему.

Примечание:

In [1]: import csv

In [2]: s = 'Aproveita essa promoção aqui!'

In [3]: print(s)
Aproveita essa promoção aqui!

In [4]: print(s.encode())
b'Aproveita essa promo\xc3\xa7\xc3\xa3o aqui!'

In [5]: with open('test.txt', 'a') as f:
   ...:     writer = csv.writer(f)
   ...:     writer.writerow([1, 3.4, 'Aproveita essa promoção aqui!'.encode()])
   ...:

In [6]: !cat test.txt
1,3.4,b'Aproveita essa promo\xc3\xa7\xc3\xa3o aqui!'

Так что просто используйте:

csvWriter.writerow([tweet.created_at, tweet.text])
0 голосов
/ 30 декабря 2018

Откройте файл с используемой кодировкой.Не кодируйте его вручную (Zen of Python: явное лучше, чем неявное):

# newline='' per csv documentation
# encoding='utf-8-sig' if you plan on using Excel to read the csv, else 'utf8' is fine.
with open('ua.csv','a',encoding='utf-8-sig',newline='') as csvFile:
    csvWriter = csv.writer(csvFile)
    for tweet in tweepy.Cursor(api.user_timeline,id=usuario,count=10,
                               lang="en",
                               since="2018-12-01").items():
    csvWriter.writerow([tweet.created_at, tweet.text)

Вот рабочий пример:

import csv
import pandas as pd

with open('ua.csv','w',encoding='utf-8-sig',newline='') as csvFile:
    csvWriter = csv.writer(csvFile)
    csvWriter.writerow(['timestamp','Aproveita essa promoção aqui!'])

test = pd.read_csv('ua.csv', encoding='utf-8-sig', header=None)
print(test)

Вывод:

           0                              1
0  timestamp  Aproveita essa promoção aqui!
0 голосов
/ 30 декабря 2018

Панды read_csv имеют параметр encoding:

Кодировка для использования в UTF при чтении / записи (например, 'utf-8').

...