Объект байтов, сохраненный в «repr format» как b'foo 'вместо encode () - в строку - как это исправить? - PullRequest
0 голосов
/ 11 декабря 2018

Некоторые несчастные коллеги сохранили некоторые данные в файл, подобный этому:

s = b'The em dash: \xe2\x80\x94'
with open('foo.txt', 'w') as f:
    f.write(str(s))

, когда они должны были использовать

s = b'The em dash: \xe2\x80\x94'
with open('foo.txt', 'w') as f:
    f.write(s.decode())

Теперь foo.txt выглядит как

b'The em-dash: \xe2\x80\x94'

Вместо

The em dash: —

Я уже прочитал этот файл как строку:

with open('foo.txt') as f:
    bad_foo = f.read()

Теперь, как я могу преобразовать bad_foo из неправильно сохраненного формата в правильно-сохраненная строка?

Ответы [ 3 ]

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

Вы можете попробовать буквальный eval

from ast import literal_eval
test = r"b'The em-dash: \xe2\x80\x94'"
print(test)
res = literal_eval(test)
print(res.decode())
0 голосов
/ 11 декабря 2018

Если вы уверены, что введенные данные не являются вредоносными , вы можете использовать ast.literal_eval для прерывистой строки.

import ast

# Create a sad broken string
s = "b'The em-dash: \xe2\x80\x94'"

# Parse and evaluate the string as raw Python source, creating a `bytes` object
s_bytes = ast.literal_eval(s)

# Now decode the `bytes` as normal
s_fixed = s_bytes.decode()

В противном случае вам придетсяпроанализируйте вручную и удалите или замените сбойные повторные сообщения.

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

Этот код работает правильно на моем компьютере.Но если вы все еще получаете ошибку, это может помочь вам

with open('foo.txt', 'r', encoding="utf-8") as f:
    print(f.read())
...