Получить только значения ASCII из байтовой строки Python с шестнадцатеричными символами - PullRequest
0 голосов
/ 31 января 2019

Когда я пытаюсь получить данные из таблицы в красном смещении и создать из нее файл CSV, но при этом я сталкиваюсь с проблемой с байтами.

b'INTERLEAVED\xff\x01\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00varchar\xff\xff\xff\xff\xff\x00\x00\x00\x00\x04\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

Мне нужно только INTERLEAVED из этих байтовданные.я попытался сделать декодирование, но результат все еще в байтовом формате даже после выполнения декодирования.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Если вы хотите, чтобы все байты в вашей строке байтов можно было интерпретировать как печатный символ ASCII, вы можете использовать (при условии, что bstr ваша строка байтов)

newstr = ''.join(chr(b) for b in bstr if 32 <= b < 128)

Это приводит к строке

'INTERLEAVEDvarchar'

Мы получили больше персонажей, чем вы ожидали.Если вам действительно нужны только символы верхнего регистра, вы можете вместо этого использовать

newstr = ''.join(chr(b) for b in bstr if ord('A') <= b < ord('Z'))

или

newstr = ''.join(chr(b) for b in bstr if 'A' <= chr(b) <= 'Z')

или, возможно,

newstr = ''.join(chr(b) for b in bstr if chr(b) in 'ABCDEFGJIJKLMNOPQRSTUVWXYZ')

Любой из этих результатов приводит кстрока

'INTERLEAVED'
0 голосов
/ 31 января 2019

попробуйте что-то вроде этого:

fixed_sample = sample.encode('ascii','ignore')
...