从带十六进制字符的字节编码 python 字符串中仅获取 ASCII 值

Get only ASCII values from byte-encoded python string with hex characters

当我尝试从 redshift 中的 table 获取数据并从中创建 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'

我只需要那个字节数据的交错。我尝试过解码,但即使在执行解码后结果仍然是字节格式。

尝试这样的事情:

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

如果您希望字节串中的所有字节都可以解释为 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'