Как преобразовать строку с байтовым значением обратно в байты? - PullRequest
1 голос
/ 05 февраля 2020

У меня есть программа, в которую я записываю вывод python check_output в файл. Я забыл установить кодировку "utf-8" и все выходные данные в байтах. Я записал эти байтовые значения в файл. Теперь у меня в файлах есть строка типа «b 'math \ xf0 \ x9d», содержащая как ASCII, так и hex. Как я могу получить только значения ASCII и преобразовать шестнадцатеричные значения, такие как \ xf0 \ x9d, в их исходные значения?

Чтобы ответить на этот вопрос, мне нужен способ преобразования строки с байтовыми значениями обратно в байты. В приведенном ниже примере opt - это байты, temp - это строка. Как я могу преобразовать temp в opt снова?

Подробнее: это код, который я изначально хотел запустить. то, что я получаю в переменной opt, имеет шестнадцатеричные значения. Я надеялся преобразовать его в строку, я бы избавился от них, но это не работает.

latex = "a+b"
opt = check_output(["latexmlmath", "--quiet", "--cmml=-", latex])
temp = str(opt)
# also tried
temp = str(opt).encode("utf-8")

Значения opt и temp:

b'<?xml version="1.0" encoding="UTF-8"?>\n<math xmlns="http://www.w3.org/1998/Math/MathML" alttext="a+b" display="block">\n  <apply>\n    <plus/>\n    <ci>\xf0\x9d\x91\x8e</ci>\n    <ci>\xf0\x9d\x91\x8f</ci>\n  </apply>\n</math>\n'
b'<?xml version="1.0" encoding="UTF-8"?>\n<math xmlns="http://www.w3.org/1998/Math/MathML" alttext="a+b" display="block">\n  <apply>\n    <plus/>\n    <ci>\xf0\x9d\x91\x8e</ci>\n    <ci>\xf0\x9d\x91\x8f</ci>\n  </apply>\n</math>\n'

1 Ответ

2 голосов
/ 05 февраля 2020

Вы хотели opt.decode('utf-8'); вызов str объекта bytes без второго (encoding) аргумента просто возвращает repr объекта bytes. Если у вас есть данные такого преобразования, вы можете преобразовать их обратно в исходный bytes объект с помощью ast.literal_eval, а затем выполнить намеченный decode результат. Пример:

import ast

baddata = 'b\'<?xml version="1.0" encoding="UTF-8"?>\\n<math xmlns="http://www.w3.org/1998/Math/MathML" alttext="a+b" display="block">\\n  <apply>\\n    <plus/>\\n    <ci>\\xf0\\x9d\\x91\\x8e</ci>\\n    <ci>\\xf0\\x9d\\x91\\x8f</ci>\\n  </apply>\\n</math>\\n\''
gooddata = ast.literal_eval(baddata).decode('utf-8')
print(gooddata)

выходы:

<?xml version="1.0" encoding="UTF-8"?>
<math xmlns="http://www.w3.org/1998/Math/MathML" alttext="a+b" display="block">
  <apply>
    <plus/>
    <ci>?</ci>
    <ci>?</ci>
  </apply>
</math>
...