【问题标题】:How to encode python dictionary?如何编码python字典?
【发布时间】:2014-07-01 11:06:00
【问题描述】:

我想对下面显示的示例内容进行编码:

name = "Myname"
status = "married"
sex = "Male"
color = {'eyeColor' : 'brown', 'hairColor' : 'golden', 'skinColor' : 'white'}

我正在使用 base64 编码方案并使用 <field-name>.encode('base64','strict') 的语法,其中 field-name 由上述字段组成 - 名称、状态等。

除了字典“颜色”之外的所有内容都被编码。 我在color.encode('base64','strict') 收到错误

错误如下图:

Traceback (most recent call last):
    color.encode('base64','strict') 
AttributeError: 'CaseInsensitiveDict' object has no attribute 'encode'

我认为编码方法不适用于字典。 我该如何一次编码完整的字典? 有没有其他适用于字典的encode 方法的替代方法?

【问题讨论】:

  • 完整的字典应该被编码成base64编码格式。
  • 另一种方法是进入字典,获取字段,单独编码并存储它们。但我正在寻找无忧的替代方案。

标签: python dictionary encoding


【解决方案1】:

encode 是字符串实例拥有的方法,而不是字典。您不能简单地将它用于每个对象的每个实例。 所以最简单的解决方案是首先在字典上调用str

str(color).encode('base64','strict')

但是,当您想要解码字符串并取回该字典时,这就不那么简单了。 Python 有一个模块可以做到这一点,它叫做pickle。 Pickle 可以帮助您获取任何对象的字符串表示形式,然后您可以将其编码为 base64。解码回来后,您还可以将其 unpickle 以取回原始实例。

b64_color = pickle.dumps(color).encode('base64', 'strict')
color = pickle.loads(b64_color.decode('base64', 'strict'))

pickle + base64 的其他替代品可能是json

【讨论】:

  • 太棒了。谢谢@Korem。它像宝石一样工作。 +1,因为我了解了新主题“泡菜”
  • 什至消耗更少内存的首选方式是什么?你的第一个选择还是酸洗??
  • @v1h5 用于什么目的?我会选择picklecPickle
  • JSON 适用于往返转换没有损失的情况。例如,如果您有 Decimal 之类的类或集合之类的类型,则转换为 JSON 有损的,建议使用 pickle。这取决于您的应用是否关心这些差异。
【解决方案2】:
color = {'eyeColor' : 'brown', 'hairColor' : 'golden', 'skinColor' : 'white'}
base64.urlsafe_b64encode(json.dumps(color).encode()).decode()

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性 cmets 挤满你的代码,因为这会降低代码和解释的可读性!
【解决方案3】:

简单易行的方法:

import json
converted_color = json.dumps(color)
encoded_color = converted_tuple.encode()
print(encoded_tuple)
decoded_color = encoded_color.decode()
orginal_form = json.load(decoded_color)

【讨论】:

    【解决方案4】:
    # Something like this works on Python 2.7.12
    from base64 import b64decode
    color = {'eyeColor' : 'brown', 'hairColor' : 'golden', 'skinColor' : 'white'}
    encoded_color = str(color).encode('base64','strict')
    print(encoded_color)
    
    decoded_color = b64decode(encoded_color)
    print(decoded_color)
    

    【讨论】:

      【解决方案5】:

      这是在 Python 中编码 Python 字典的另一种方式。

      我在 Python 36 中测试过

      import base64
      
      my_dict = {'name': 'Rajiv Sharma', 'designation': "Technology Supervisor"}
      encoded_dict = str(my_dict).encode('utf-8')
      
      base64_dict = base64.b64encode(encoded_dict)
      print(base64_dict)
      
      my_dict_again = eval(base64.b64decode(base64_dict))
      print(my_dict_again)
      

      输出:

      b'eyduYW1lJzogJ1Jhaml2IFNoYXJtYScsICdkZXNpZ25hdGlvbic6ICdUZWNobm9sb2d5IFN1cGVydmlzb3InfQ=='
      {'name': 'Rajiv Sharma', 'designation': 'Technology Supervisor'}
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 2021-05-03
      • 1970-01-01
      相关资源
      最近更新 更多