Декодирование литералов UTF8 в файл CSV - PullRequest
0 голосов
/ 24 июня 2018

Вопрос:

Кто-нибудь знает, как я мог бы преобразовать это b"it\\xe2\\x80\\x99s time to eat" в это it's time to eat


Подробнее и мой код:

Привет всем,

В настоящее время я работаю с файлом CSV, в котором полно строк с литералами UTF8, например:

b "пора \ xe2 \ x80 \ x99s поесть"

Конечная цель - получить что-то вроде этого:

пора кушать

Для этого я попытался использовать следующий код:

import pandas as pd


file_open = pd.read_csv("/Users/Downloads/tweets.csv")

file_open["text"]=file_open["text"].str.replace("b\'", "")

file_open["text"]=file_open["text"].str.encode('ascii').astype(str)

file_open["text"]=file_open["text"].str.replace("b\"", "")[:-1]

print(file_open["text"])

После запуска кода строка, которую я взял в качестве примера, распечатывается как:

пришло время поесть

Я пытался решить эту проблему используя следующий код, чтобы открыть файл CSV:

file_open = pd.read_csv("/Users/Downloads/tweets.csv", encoding = "utf-8")

, который распечатал пример строки следующим образом:

пришло время поесть

и я также попытался декодировать строки, используя это:

file_open["text"]=file_open["text"].str.decode('utf-8')

Который дал мне следующую ошибку:

AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas

Большое спасибо заранее за помощь.

1 Ответ

0 голосов
/ 24 июня 2018

b"it\\xe2\\x80\\x99s time to eat" звучит так, как будто ваш файл содержит экранированную кодировку.

В общем, вы можете преобразовать это в правильную строку Python3 с чем-то вроде:

x = b"it\\xe2\\x80\\x99s time to eat"
x = x.decode('unicode-escape').encode('latin1').decode('utf8')
print(x)     # it’s time to eat

(Использование .encode('latin1') объяснено здесь )

Итак, если после использования pd.read_csv(..., encoding="utf8") у вас все еще есть экранированные строки, вы можете сделать что-то вроде:

pd.read_csv(..., encoding="unicode-escape")
# ...
# Now, your values will be strings but improperly decoded:
#    itâs time to eat
#
# So we encode to bytes then decode properly:
val = val.encode('latin1').decode('utf8')
print(val)   # it’s time to eat

Но я думаювероятно, лучше сделать это для всего файла, а не для каждого значения в отдельности, например, с помощью StringIO (если файл не слишком большой):

from io import StringIO

# Read the csv file into a StringIO object
sio = StringIO()
with open('yourfile.csv', 'r', encoding='unicode-escape') as f:
    for line in f:
        line = line.encode('latin1').decode('utf8')
        sio.write(line)
sio.seek(0)    # Reset file pointer to the beginning

# Call read_csv, passing the StringIO object
df = pd.read_csv(sio, encoding="utf8")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...