首页 > 解决方案 > 尝试将字节解码为字符串时出错

问题描述

这是我获取二进制数据的函数。

def get_remote_file_binary_data(self, filename, connection_string = ""):
    file_data = None
    tmp_file_path = copyfile.make_temp_path()
    try:
        if connection_string:
            print("connection string is: ", connection_string) 
            source_file = copyfile.join(connection_string, filename)
        else:
            source_file = filename
    
        copyfile.copyfile(source_file, tmp_file_path)
    
        tmp_file = open(tmp_file_path, "rb")
        file_data = tmp_file.read()
        tmp_file.close()
    finally:
        os.remove(tmp_file_path)
    return file_data

这是我正在返回的数据

b"PK\x03\x04\x14\x00\x01\x00\x08\x00Fu\x87RR\xa6cpr\x00\x00\x00z\x00\x00\x00\x0c\x00\x00\x00fake_xml.xml)\xe0H\x86]\x83\xd2\xb8\\\xe2\x10\x95f\xde\xa6\x83|&\xa5\x99VwOS\x19\xea\xdb}\xee1[\xe0\x0f'0:C|6u2\xe4\xa6\xbcc\x8e\xdb\xd16(\x1d?\xba\x98Vp\x11\xb5\x06\xe8\xdcn\x0b\xc5I'B\x83#W\xac\xe5*+t\xa6\xa9\xd5\x85\x04\x86+{\xad\xe1\x8b{\xbf\x88L\xc4\xff\xa9=\x18\x9di\xa96Y$3\xfa\x98\x9c\x10\x99\n\x80PG\x9c\xd0GPK\x01\x02?\x00\x14\x00\x01\x00\x08\x00Fu\x87RR\xa6cpr\x00\x00\x00z\x00\x00\x00\x0c\x00$\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00fake_xml.xml\n\x00
\x00\x00\x00\x00\x00\x01\x00\x18\x00\x89R~\x1a\xe6+\xd7\x01
\xe3\xf8\x1a\xe6+\xd7\x01T\xb5N\x1a\xe6+\xd7\x01PK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00^\x00\x00\x00\x9c\x00\x00\x00\x00\x00"

这是调用上述函数的代码。

zip_file = self.get_remote_file_binary_data(zip_filename, connection_str)

这是我尝试过的以及我在评论中遇到的错误

zip_file = zip_file.decode('UTF-8') # 'utf-8' codec can't decode byte 0x87 in position 12: invalid start byte
zip_file = zip_file.decode('UTF-16')  # codec can't decode bytes in position 54-55: illegal encoding
zip_file = zip_file.decode('ascii')  #'ascii' codec can't decode byte 0x87 in position 12: ordinal not in range(128)
zip_file = zip_file.decode('ANSI_X3.4-1968') # ascii' codec can't decode byte 0x87 in position 12: ordinal not in range(128)

标签: pythonpython-3.xdecode

解决方案


import io
from zipfile import ZipFile

bites = b"PK\x03\x04\x14\x00\x01\x00\x08\x00Fu\x87RR\xa6cpr\x00\x00\x00z\x00\x00\x00\x0c\x00\x00\x00fake_xml.xml)\xe0H\x86]\x83\xd2\xb8\\xe2\x10\x95f\xde\xa6\x83|&\xa5\x99VwOS\x19\xea\xdb}\xee1[\xe0\x0f'0:C|6u2\xe4\xa6\xbcc\x8e\xdb\xd16(\x1d?\xba\x98Vp\x11\xb5\x06\xe8\xdcn\x0b\xc5I'B\x83#W\xac\xe5*+t\xa6\xa9\xd5\x85\x04\x86+{\xad\xe1\x8b{\xbf\x88L\xc4\xff\xa9=\x18\x9di\xa96Y$3\xfa\x98\x9c\x10\x99\n\x80PG\x9c\xd0GPK\x01\x02?\x00\x14\x00\x01\x00\x08\x00Fu\x87RR\xa6cpr\x00\x00\x00z\x00\x00\x00\x0c\x00$\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00fake_xml.xml\n\x00 \x00\x00\x00\x00\x00\x01\x00\x18\x00\x89R~\x1a\xe6+\xd7\x01 \xe3\xf8\x1a\xe6+\xd7\x01T\xb5N\x1a\xe6+\xd7\x01PK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00^\x00\x00\x00\x9c\x00\x00\x00\x00\x00"

print(ZipFile(io.BytesIO(bites)).filelist[0])

输出:

<ZipInfo filename='fake_xml.xml' compress_type=deflate external_attr=0x20 file_size=122 compress_size=114>

推荐阅读