如何从字节数据字符串下载文件?转换失效问题求解决方案
问题描述
我能直接通过字节数据成功保存可用的xlsx文件,但尝试把字节数据的字符串形式转换后保存时,生成的文件无法打开。相关代码如下:
############ Unable to download using string ################### some_bytes = str(b'PK\x03\x04\x14\x00\x00\...') byte_data_str = some_bytes[2:-1] byte_data = byte_data_str.encode() print(byte_data) with open("test_file11.xlsx", "wb") as binary_file: binary_file.write(byte_data) ############ Able to download on byte data ############## some_bytes2 = b'PK\x03\x04\x14\x00\x00\...' with open("test_file12.xlsx", "wb") as binary_file: binary_file.write(some_bytes2)
请问有没有可行的方法,能通过字节数据的字符串形式输入,生成可用的文件?
解决方案
错误原因
你当前的方法失效,是因为str(b'...')得到的是字节对象的字符串表示(repr格式),比如原字节中的\x03会被转成字符串里的\\x03(四个字符)。后续你截取[2:-1]再encode(),只是把这些字符转成字节,完全不是原来的二进制数据,自然无法生成可用文件。
方法1:用ast.literal_eval解析repr字符串
如果你的字符串是从字节对象的repr形式得到的(比如开头带b',结尾带'),可以用ast.literal_eval直接还原成字节对象:
import ast # 假设这是你拿到的字节数据字符串 some_bytes_str = "b'PK\\x03\\x04\\x14\\x00\\x00...'" # 解析字符串还原字节对象 original_bytes = ast.literal_eval(some_bytes_str) # 写入文件 with open("test_file_fixed.xlsx", "wb") as binary_file: binary_file.write(original_bytes)
方法2:用Base64编码存储字节的字符串形式
如果是你自己生成字节的字符串表示,更推荐用Base64编码,这是二进制数据转字符串的标准方式,避免repr格式的转义问题:
生成Base64字符串(从字节转):
import base64 original_bytes = b'PK\x03\x04\x14\x00\x00...' # 字节转Base64字符串 base64_str = base64.b64encode(original_bytes).decode('utf-8')
从Base64字符串还原字节并写入文件:
import base64 # 假设这是你拿到的Base64字符串 base64_str = "UEsDBBQAAAAIAA...(省略内容)" # Base64字符串转字节 restored_bytes = base64.b64decode(base64_str) # 写入文件 with open("test_file_base64.xlsx", "wb") as binary_file: binary_file.write(restored_bytes)
内容的提问来源于stack exchange,提问作者Ben David
相关产品推荐
相关产品推荐

