【问题标题】:Change any type to bytes in python在python中将任何类型更改为字节
【发布时间】:2021-05-11 13:35:19
【问题描述】:

在 python 中,你可以将 python 中的任何类型更改为这样的字符串:

str(data)

有没有办法像str(data) 方法一样将任何类型更改为字节? (没有 if 语句)?

类似bytes(data):

# examples
data = "hello"
data = bytes(data) # data is now b'hello'

data = 23423
data = bytes(data) # data is now b'23423'

data = b'nice'
data = bytes(data) # data is now b'nice'

data = [0, 3]
data = bytes(data) # data is now b'[0, 3]'

使用str(data).encode()bytes(str(value), "utf-8") 不是我想要的,因为当数据data = b'dsfsdf' 输出是b"b'dsfsdf'"

【问题讨论】:

  • bytes(str(value), "utf-8")
  • @Martheen 我正在尝试不导入库
  • @lordcommander,这不是你的问题。
  • 没有内置函数可以完全满足您的需求。你基本上想要data if isinstance(data, bytes) else str(data).encode()

标签: python byte


【解决方案1】:

当您为自定义对象调用str(data) 时,它基本上是在调用data.__str__(),因此通过为您的对象提供__str__ 方法,您可以准确指定str(data) 的实际外观。对于bytes(data),你只需要实现__bytes__

In [1]: class A:
   ...:   def __bytes__(self):
   ...:     return b"A"

In [2]: bytes(A())[0] == 65
Out[2]: True

In [3]: bytes(A())
Out[3]: b'A'

In [4]: str(A())
Out[4]: "<class '__main__.A'>"

要在您的示例中处理基本类型,如果您对它们的字符串表示感到满意,您可以这样做:

def to_bytes(x):
  return x if isinstance(x, bytes) else str(x).encode()

如果您想要更健壮的东西,请使用像 pickle 这样的序列化库

【讨论】:

    【解决方案2】:

    由于评论中有关于使用pickle包进行序列化的建议,这里是执行它的代码

    import pickle
    
    data = "hello"
    byte_data = pickle.dumps(data)
    print(pickle.loads(byte_data))
    
    data = 23423
    byte_data = pickle.dumps(data)
    print(pickle.loads(byte_data))
    
    data = b'nice'
    byte_data = pickle.dumps(data)
    print(pickle.loads(byte_data))
    
    data = [0, 3]
    byte_data = pickle.dumps(data)
    print(pickle.loads(byte_data))
    
    output :
    hello
    23423
    b'nice'
    [0, 3]
    

    ps:感谢Olvin Roght 建议使用pickle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 2022-11-07
      相关资源
      最近更新 更多