декодирование Unicode-значений в виде текста из CSV-файла ошибки - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть столбец в CSV-файле, в котором значения Unicode (\ x) записаны как обычный текст. У меня есть следующий код (не мой), который я пытаюсь использовать для декодирования этого текста, но он выдает синтаксическую ошибку при попытке его использовать.

with open("fixed_datasetssscopy.csv", "r") as fp:
    file_buffer = io.StringIO()
    for line in fp.read().splitlines():
        file_buffer.write(eval('''b"{}".decode('utf-8')'''.format(line)))
        file_buffer.write('\n')
    file_buffer.seek(0)
df = pandas.from_csv(file_buffer)

При просмотре записей, которые выбрасывают ошибки, они заключаются в кавычки "", когда я печатаю их в своей IDE, хотя в самом файле CSV их нет. Пример некоторых записей, которые дают ошибки, приведены ниже.

ER...in the end it's a job. So, fair dos. https:/asdasd
When i started using Gutenberg like a month ago, I didn't care for the workflow but now it makes it easy to do thin\xe2\x80\xa6 https:/asdasd

Фактическое сообщение об ошибке:

Traceback (most recent call last):
  File "C:/Users", line 8, in <module>
    file_buffer.write(eval('''b"{}".decode('utf-8')'''.format(line)))
  File "<string>", line 1
    b""ER...in the end it's a job. So, fair dos. https://u",,,,,,,,,".decode('utf-8')
    ^
SyntaxError: invalid syntax

Как я могу исправить эту ошибку?

1 Ответ

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

Вы получаете ошибку из-за \ "во входной строке. Я внес некоторые изменения в ваш код, чтобы заставить его работать.

Быстрое исправление

with open("fixed_datasetssscopy.csv", "r") as fp:
    file_buffer = io.StringIO()
    for line in fp.read().splitlines():
       file_buffer.write(bytes(line, "utf-8").decode("unicode_escape"))
       file_buffer.write('\n')
    file_buffer.seek(0)
df = pandas.DataFrame.from_csv(file_buffer)

Другая проблема в вашем коде заключается в том, что вы использовали pandas.from_csv вместо pandas.DataFrame.from_csv.

Также рекомендуется использовать pandas.read_csv вместо from_csv. Это потому, что DataFrame.from_csv сейчас устарела (см. здесь ).

Pandas.read_csv также намного быстрее, чем from_csv. Вы можете найти документацию для read_csv здесь

Дольше (лучше) решение

Приведенное выше решение не работает, если ваша входная строка содержит действительные символы Юникода. В вашем примере он будет выводить такие символы, как ' как \'

Вы можете продолжить работу с вышеупомянутым решением, если уверены, что все символы в вашем входном наборе являются ASCII-текстом

Если на входе есть последовательности ASCII, то вы можете вручную заменить «\» на входе.

Это уже сделано rspeer здесь

...