【问题标题】:Unicode to dictionary (unicode contains apostrophe punctuation)Unicode 到字典(unicode 包含撇号标点符号)
【发布时间】:2019-01-09 14:00:12
【问题描述】:

我从 CSV 文件中读取了以下 Unicode:

line = u"{u'There's Still Time': u'foo'}"

我希望能够将其转换为字典,以便可以按以下方式访问它:

line["There's Still Time"] 
Output: 'foo'

请帮忙。

【问题讨论】:

  • 您使用的是 Python 2 还是 Python 3? Python 3 默认支持 Unicode,你应该尽可能使用它。
  • @RobRose 这根本不是问题。问题是 OP 将 dict 对象的字符串表示形式转储到 csv 文件中,现在必须对其进行反序列化。 真正的 解决方案是从一开始就使用适当的序列化格式。如果这不可能,他们可以使用链接的重复目标中的一种方法。
  • 你真的应该选择更好的序列化格式。不要只是将对象的字符串表示形式转储到文件中并称之为序列化。
  • 撇号使其语法无效,您将找不到解决方案。理解该文本的唯一方法是制定一个规则,即必须忽略错误位置的撇号。这是一个非常定制的要求。
  • 这个 CSV 文件是如何创建的?如果没有启发式(a)编写和测试不平凡,并且(b)在某些情况下可能是错误的,则无法对其进行解析,从而产生垃圾。如果 CSV 文件来自您编写的代码、同事编写的代码或您支付或合作的公司编写的代码,则修复该代码并生成正确的 CSV 文件。这将比提出和实施尝试修复损坏数据的启发式方法更容易、更好。

标签: python dictionary converter unicode-string


【解决方案1】:

鉴于字符串中有一个撇号,您必须在尝试将其解析为dict 之前进行一些预处理。假设目标 dict 中的所有字符串都是 unicode,并且结束字符串必须紧跟一个控制字符(即 }:,}、空格...),您可以搜索与这两个类别不匹配的所有撇号并将它们转义。然后你可以使用ast.literal_eval() 将其解析为dict,类似于:

import ast
import re

APOSTROPHE_ESCAPE = re.compile(r"(?<!u)'(?![.}:,\s])")

line = u"{u'There's Still Time': u'foo'}"
your_dict = ast.literal_eval(APOSTROPHE_ESCAPE.sub(r"\'", line))

print(your_dict)  # {u"There's Still Time": u'foo'}

请记住,这只是一个简单的:

line = u"{u'There'}s Still Time': u'foo'}"

会把它扔掉 - 当然,它也是源中的非法字典,但请记住这些限制并相应地调整您的预处理正则表达式。

【讨论】:

    猜你喜欢
    • 2015-07-07
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2017-07-12
    • 2021-04-06
    相关资源
    最近更新 更多