将二进制(字节)转换为str,反之亦然

时间:2018-12-25 17:51:24

标签: python python-3.x pandas dataframe

考虑到我有一个二进制数据,例如在import * as express from 'express'; export default class indexRouter { private gameService: any; constructor(gameService: any) { this.gameService = gameService; } router() { let router = express.Router(); router.get("/", this.get.bind(this)); router.post("/test", this.test.bind(this)); return router; } test(req: any, res: any) { // console.log("indexRouter get()"); console.log(req.body); res.render("gameboard", { pin: "1", username: "1", player: 1 }); } get(req: any, res: any, next:any) { req.body = {3:"3"}; // something i want to do here } } 的列中:

dataframe

我需要一个想法,如何仅针对每个b'x\x9c\xd4\x14Q\xd3\xf7\x92\x8b\x89 \x01\xc3)B\x8c\x80\x91#\x86\xfb\xa6\x9b\x10\xce\x00\x86p\x85Cr\x11\xd8p\x84\xcc\x12<A\x17!'列值将其转换为字符串,因为此binary需要转换为json类型并作为rest api端点的结果传递。

这是我如何以json格式返回dataframe(使用二进制文件对dataframe进行处理会引发异常):
dataframe
return json.loads(df.to_json(orient='table'))是一个数据帧

我当然想知道如何将二进制值从df的字符串表示形式再次转换回bytes-二进制。

1 个答案:

答案 0 :(得分:0)

您需要了解用于创建这些字节的编码。默认编码是特定于平台的,请检查您的编码:

import sys
sys.getdefaultencoding() # 'utf-8' on macos python 3.7

如果将字符串传递给pickle.dumps,它将使用默认编码进行编码;如果要使用其他编码,则可以在将字符串传递给pickle.dumps之前对其进行编码(例如)。

In [2]: pickle.dumps('höy') # will be 'utf-8' encoded by default
Out[2]: b'\x80\x03C\x04h\xc3\xb6yq\x00.'

In [3]: 'höy'.encode('utf-8')
Out[3]: b'h\xc3\xb6y' # compare with the previous output

In [4]: pickle.dumps('höy'.encode('latin1'))
Out[4]: b'\x80\x03C\x03h\xf6yq\x00.'

In [5]: 'höy'.encode('latin1')
Out[5]: b'h\xf6y' # compare with the previous output

根据编码,您可以解码字符串:

In [1]: 'höy'.encode('utf-8').decode('utf-8')
Out[1]: 'höy'

In [2]: 'höy'.encode('latin-1').decode('latin-1')
Out[2]: 'höy'

使用错误的编码将导致失败或错误的结果:

In [3]: 'höy'.encode('utf-8').decode('latin-1')
Out[3]: 'höy'

并非每个随机字节都是编码字符串:

In [6]: pickle.dumps('höy').decode('utf-8')
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-6-2b1872a5aa1a> in <module>
----> 1 pickle.dumps('höy').decode('utf-8')

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte