【问题标题】:Convert every dictionary value to utf-8 (dictionary comprehension?)将每个字典值转换为 utf-8(字典理解?)
【发布时间】:2016-02-15 10:10:57
【问题描述】:

我有一本字典,我想将每个值都转换为 utf-8。这行得通,但有没有“更蟒蛇”的方式?

            for key in row.keys():
                row[key] = unicode(row[key]).encode("utf-8")

我可以做的列表

[unicode(s).encode("utf-8") for s in row]

但我不确定如何为字典做同样的事情。

这与Python Dictionary Comprehension 不同,因为我不是要从头开始创建字典,而是从现有字典。链接问题的解决方案没有向我展示如何遍历现有字典中的键/值对,以便将它们修改为新字典的新 k/v 对。下面的答案(已被接受)显示了如何做到这一点,并且对于与我有类似任务的人来说,阅读/理解比链接相关问题的答案更容易理解,后者更复杂。

【问题讨论】:

  • 令我印象深刻的是,您设法提出了正确的短语(字典理解),但没有搜索“python 字典理解”!
  • 为什么要将密钥转换为 utf-8?这听起来像 XY 问题
  • 危险将罗宾逊! unicode(row[key]) 将使用系统字符集来解码 row[key]。这意味着row[key] 已经编码为特定字符集。此外,在需要将其输出到某个地方之前,您不应该进行编码,在这种情况下,允许 print 使用编码文本包装器进行转换或写入,例如 io.open()
  • @DSM 我找到了列表理解,并推断为字典理解,但是当我搜索它时没有找到一个很好的例子。

标签: python utf-8 list-comprehension


【解决方案1】:

使用dictionary comprehension。看起来您是从字典开始的:

 mydict = {k: unicode(v).encode("utf-8") for k,v in mydict.iteritems()}

字典理解的例子在链接中的块的末尾附近。

【讨论】:

    【解决方案2】:

    如果您愿意,可以只遍历键:

    {x:unicode(a[x]).encode("utf-8") for x in a.keys()}
    

    【讨论】:

      【解决方案3】:

      这取决于您为什么要隐式编码为 UTF-8。如果是因为您正在写入文件,pythonic 方法是将您的字符串保留为 Unicode 并在输出上编码:

      with io.open("myfile.txt", "w", encoding="UTF-8") as my_file:
          for (key, values) in row.items():
              my_string = u"{key}: {value}".format(key=key, value=value)
              my_file.write(my_string)
      

      【讨论】:

      • 我是,但我是用 csv DictWriter 编写的,我不确定在这种情况下如何对输出进行编码。
      • Python 2.x 的 CSV 模块被 Unicode 破坏了,所以其他贡献者的答案是最简单的方法。如果你想正确地做到这一点,就像 Python3 那样,使用一个固定的 CSV 模块:github.com/jdunck/python-unicodecsv
      • 由于其他原因我不能使用 Python 3,但如果可能的话,感谢您展示“正确的方法”。
      【解决方案4】:

      ascii 字符中转换 non-ascii 字典值的最佳方法是

      mydict = {k: unicode(v, errors='ignore').encode('ascii','ignore') for k,v in mydict.iteritems()} 
      

      utf-8 字符中转换 non-utf-8 字典值的最佳方法是

      mydict = {k: unicode(v, errors='ignore').encode('utf-8','ignore') for k,v in mydict.iteritems()}
      

      更多参考请阅读python unicode documentation

      【讨论】:

        【解决方案5】:

        因为我也遇到了这个问题,所以我构建了一个非常简单的函数,允许任何 dict 以 utf-8 解码(当前答案的问题是它仅适用于简单的 dict)。

        如果它可以帮助任何人,那就太好了,这是功能:

        def utfy_dict(dic):
            if isinstance(dic,unicode):
                return(dic.encode("utf-8"))
            elif isinstance(dic,dict):
                for key in dic:
                    dic[key] = utfy_dict(dic[key])
                return(dic)
            elif isinstance(dic,list):
                new_l = []
                for e in dic:
                    new_l.append(utfy_dict(e))
                return(new_l)
            else:
                return(dic)
        

        【讨论】:

          【解决方案6】:

          Python 3 版本建立在 That1Guy 的那个答案之上。

          {k: str(v).encode("utf-8") for k,v in mydict.items()}
          

          【讨论】:

          • 您可以通过调用str(v, 'utf-8')进一步简化此操作
          猜你喜欢
          • 2017-01-21
          • 1970-01-01
          • 2011-09-19
          • 1970-01-01
          • 2019-09-13
          • 2018-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多