【问题标题】:Unable to remove additional double quotes in json string added by python无法删除python添加的json字符串中的额外双引号
【发布时间】:2015-08-12 18:08:24
【问题描述】:

我有一个文件,其内容是

{'FileID': 'a3333.txt','Timestamp': '2014-12-05T02:01:28.271Z','SuccessList':'a,b,c,d,e'}

当我使用 python 读取文件时,我得到的字符串为

"{'FileID': 'a3333.txt','Timestamp': '2014-12-05T02:01:28.271Z','SuccessList':'a,b,c,d,e'}"

我希望从字符串的开头和结尾删除双引号。从 python 文档中,我知道如果字符串中有单引号,python 会自行添加双引号以避免转义。

【问题讨论】:

  • 实际上没有双引号。
  • 你确定 json 是正确的吗?如果我没记错,JSON 需要字符串的双引号,而不是单引号,这似乎是您的文件包含的内容?开头和结尾的双引号只是表示它是一个字符串,它实际上不是字符串的一部分。
  • 您如何查看文件的内容?如果您在交互式提示中,请确保使用 print my_file_contents 而不仅仅是 my_file_contents,因为后者会显示外部引号。
  • 你想用 JSON 做什么?例如,如果您在之后立即将其写入文件,则不会有任何双引号。之所以添加它们,是因为您将其作为字符串读取。

标签: python python-2.7 python-3.x


【解决方案1】:

如果存储的文件是 JSON,那么它们是无效的。 JSON 格式不允许使用单引号来分隔字符串。 假设键/值字符串本身没有单引号,您可以将单引号替换为双引号,然后使用 JSON 模块读入:

import json
x = "{'FileID': 'a3333.txt','Timestamp': '2014-12-05T02:01:28.271Z','SuccessList':'a,b,c,d,e'}"
x = x.replace("'", '"')
j = json.loads(x)
print j

产量:

{'FileID': 'a3333.txt','Timestamp': '2014-12-05T02:01:28.271Z','SuccessList':'a,b,c,d,e'}

或者:

如果数据是 Python dict 的字符串表示形式,您可以使用 eval 读取它。使用eval 是危险的(请参阅Ned Batchelder 的想法)。也就是说,如果您自己编写了该文件并且您确信它不包含恶意代码,您可以使用eval 将字符串读取为 Python 源代码:

x = "{'FileID': 'a3333.txt','Timestamp': '2014-12-05T02:01:28.271Z','SuccessList':'a,b,c,d,e'}"
eval(x, {'__builtins__': {}})

产量:

{'FileID': 'a3333.txt','Timestamp': '2014-12-05T02:01:28.271Z','SuccessList':'a,b,c,d,e'}

不要养成这样的习惯!正确的做法是将数据以适当的序列化格式保存到文件中,然后使用 json 模块之类的库从磁盘读取它。

【讨论】:

    【解决方案2】:

    如果您的字符串实际上包含双引号(它可能不包含,因为它们可能只是打印表示的一部分),您可以用切片去掉它们,例如,

    >>> hello = '"hello more stuff things"'
    >>> hello
    '"hello more stuff things"'
    >>> hello[1:-1]
    'hello more stuff things'
    

    请注意,在这种情况下,外部单引号不是字符串的一部分,它们只是打印表示的一部分。

    【讨论】:

      【解决方案3】:

      您可以使用

      string 转换回 dictionary
      import re
      x="{'FileID': 'a3333.txt','Timestamp': '2014-12-05T02:01:28.271Z','SuccessList':'a,b,c,d,e'}"
      print dict(re.findall(r"""'([^']*)'\s*:\s*'([^']*)'""",x))
      

      【讨论】:

        【解决方案4】:

        您所指的双引号不是字符串的一部分,只是用来分隔它。

        如果将字符串“this's”分配给变量:

        >>> a = "thi's'"

        该字符串中的第一个元素是t

        >>> a[0]

        t

        在您的示例中,字符串中的第一个元素是{,我相信这是您所期望的。

        【讨论】:

        • 你写的是“是字符串的一部分”。那应该是“不是字符串的一部分”。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-18
        • 1970-01-01
        • 2013-05-14
        相关资源
        最近更新 更多