Как заменить шестнадцатеричное значение в строке - PullRequest
0 голосов
/ 27 марта 2019

При импорте данных из плоского файла я заметил некоторые встроенные шестнадцатеричные значения в строке (<0x00>, <0x01>).

Я хочу заменить их конкретными символами, но не могу этого сделать.Удаление их тоже не сработает.Как это выглядит в экспортированном плоском файле: https://i.imgur.com/7MQpoMH.png Другой пример: https://i.imgur.com/3ZUSGIr.png


Это то, что я пробовал: (и обратите внимание, <0x01> представляет не-редактируемая сущность. Здесь она не распознается.)

import io
with io.open('1.txt', 'r+', encoding="utf-8") as p:
    s=p.read()
# included in case it bears any significance
import re
import binascii

s = "Some string with hex: <0x01>"

s = s.encode('latin1').decode('utf-8')
# throws e.g.: >>> UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfc in position 114: invalid start byte

s = re.sub(r'<0x01>', r'.', s)
s = re.sub(r'\\0x01', r'.', s)
s = re.sub(r'\\\\0x01', r'.', s)
s = s.replace('\0x01', '.')
s = s.replace('<0x01>', '.')
s = s.replace('0x01', '.')

или что-то в этом духе в надежде понять его, перебирая всю строку:

for x in s:
    try:
        base64.encodebytes(x)
        base64.decodebytes(x)
        s.strip(binascii.unhexlify(x))
        s.decode('utf-8')
        s.encode('latin1').decode('utf-8')
    except:
        pass

Кажется, ничего не получается сделать.

Я бы ожидал, что символы будут заменены методами, которые я выкопал, но это не так.Что мне не хватает?NB. Я должен сохранить умляуты (äöüÄÖÜ)

- редактировать:

Могу ли я сначала ввести шестнадцатеричные значения при экспорте?Если так, есть ли способ избежать этого?

with io.open('out.txt', 'w', encoding="utf-8") as temp:
    temp.write(s)

1 Ответ

0 голосов
/ 27 марта 2019

Судя по изображениям, это фактически управляющие символы.Ваш редактор отображает их серым способом, показывая вам значение байтов в шестнадцатеричном формате.В ваших данных нет символов «0x01», но на самом деле это один байт со значением 1, поэтому unhexlify и друзья не помогут.

В Python эти символы могут бытьпроизводится в строковых литералах с escape-последовательностями с использованием обозначения \xHH с двумя шестнадцатеричными цифрами.Фрагмент первого изображения, вероятно, равен следующей строке:

"sich z\x01 B. irgendeine"

Ваши попытки удалить их были близки.s = s.replace('\x01', '.') должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...