【问题标题】:Convert unicode string dictionary into dictionary in python将unicode字符串字典转换为python中的字典
【发布时间】:2013-02-03 16:58:54
【问题描述】:

我有 unicode u"{'code1':1,'code2':1}",我想要字典格式。

我想要{'code1':1,'code2':1} 格式。

我试过unicodedata.normalize('NFKD', my_data).encode('ascii','ignore'),但它返回字符串而不是字典。

谁能帮帮我?

【问题讨论】:

    标签: python unicode dictionary


    【解决方案1】:

    你可以使用内置的ast包:

    import ast
    
    d = ast.literal_eval("{'code1':1,'code2':1}")
    

    帮助 ast 模块中的函数 literal_eval:

    literal_eval(node_or_string)

    安全地计算表达式节点或包含 Python 表达式的字符串。提供的字符串或节点只能由以下 Python 文字结构组成:字符串、数字、元组、列表、字典、布尔值和无。

    【讨论】:

    • 如果我有类似 {u'a': {u'nstext': u'(Article)', u'title': u'article title', u'namespace': u' 0', u'len': u'4339', u'touched': u'20140829055924', u'id': u'28621'}, u'n': u'page'} 这个答案给了我ValueError:格式错误的字符串
    • 尝试时出错(像往常一样,对我没有任何作用):SyntaxError:解析时意外 EOF,文件“”,第 1 700 000 行 ^
    • @LawrenceDeSouza 看起来您的文件有问题,而不是我的回答。不明白您为什么需要对其投反对票,但这取决于您。
    • 这是我最终使用的代码,如下所示: data_meta = json.loads( str( myjsonstring ) ) 也许您的代码不适用于字符串,而仅适用于文件。
    • 天啊,我一直在寻找这样的东西!
    【解决方案2】:

    您可以使用literal_eval。您可能还想确保您正在创建一个 dict 而不是其他东西。不要使用assert,而是使用您自己的错误处理。

    from ast import literal_eval
    from collections import MutableMapping
    
    my_dict = literal_eval(my_str_dict)
    assert isinstance(my_dict, MutableMapping)
    

    【讨论】:

      【解决方案3】:

      编辑:原来我的假设不正确;因为键没有用双引号 (") 括起来,所以字符串不是 JSON。See here 可以解决这个问题。

      我猜你所拥有的可能是 JSON,也就是 JavaScript 对象表示法。

      您可以使用 Python 的内置 json 模块来执行此操作:

      import json
      result = json.loads(u"{'code1':1,'code2':1}")   # will NOT work; see above
      

      【讨论】:

      • 对我来说效果很好。
      【解决方案4】:

      我从文件中读取 json 时遇到 unicode 错误。所以这个对我有用。

      import ast
      job1 = {}
      with open('hostdata2.json') as f:
        job1= json.loads(f.read())
      
      f.close()
      
      #print type before converting this from unicode to dic would be <type 'unicode'>
      
      print type(job1)
      job1 =  ast.literal_eval(job1)
      print "printing type after ast"
      print type(job1)
      # this should result <type 'dict'>
      
      for each in job1:
       print each
      print "printing keys"
      print job1.keys()
      print "printing values"
      print job1.values()
      

      【讨论】:

      • 当您在with 中有open() 语句时,无需调用close() 方法——它会在with 完成后自动发生。
      【解决方案5】:

      您可以使用内置的eval函数将字符串转换为python对象

      >>> string_dict = u"{'code1':1, 'code2':1}"
      >>> eval(string_dict)
      {'code1': 1, 'code2': 1}
      

      【讨论】:

      • 有人曾经告诉我,eval 是邪恶的。请改用literal_eval。
      • @pyrospade 为什么会这样?
      • @Ishanmahajan, eval() 对正在执行的代码不提供任何限制或保护。例如,它会愉快地使用os 模块来重组文件夹、删除文件等。这是一个严重且危险的安全漏洞。另一方面,literal_eval 受到非常严格的限制。它只会在某些有限的表达式上起作用,这些表达式不会影响应用程序本身之外的任何内容。
      猜你喜欢
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      • 2013-03-13
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      相关资源
      最近更新 更多