[[{"date":"January 2004"},true,false,100,null,null,true],[{"date":"February 2004"},false,false,99,null,null,true]]
我有一长串来自javascript文件的数据,如上所述。是否有快捷方式或库可以将其解析为适当的数据类型?
如您所见,它是包含字典,布尔值,整数和空值的列表列表。
我的意思是,我可以手工做到这一点,但我认为我不能很快或有效地做到这一点。必须有一个更好的方法。
答案 0 :(得分:5)
漂亮接近有效的JSON。唯一无效的是False
应为false
而True
应为true
。那可能是转录错误(...是的)
使用json
:
import json
x = '[[{"date":"January 2004"},true,false,100,null,null,true],[{"date":"February 2004"},false,false,99,null,null,true]]'
json.loads(x)
Out[20]:
[[{'date': 'January 2004'}, True, False, 100, None, None, True],
[{'date': 'February 2004'}, False, False, 99, None, None, True]]
答案 1 :(得分:2)
我建议你看一下PyParsing。
http://pyparsing.wikispaces.com/
您还可以查看Python" scanf"库。
如果你只需要使用Python内置函数来解决这个问题,我建议使用带捕获组的正则表达式。
编辑:嗯,我再看看这个。你确实说它来自JavaScript ...这对我来说就像一个合法的JSON数组。我尝试使用json
模块(特别是方法函数json.loads()
),但我无法解析它。
但是! Python语法接近JavaScript语法。替换一些内容,eval()
可以解析此内容,或ast.literal_eval()
。我们需要将true
替换为True
,将false
替换为False
,将null
替换为None
,ast.literal_eval()
将接受import ast
s = '[[{"date":"January 2004"},True,False,100,null,null,true],[{"date":"February 2004"},False,False,99,null,null,true]]'
s1 = s.replace("true","True").replace("false","False").replace("null","None")
x = ast.literal_eval(s1)
print(x)
。
[[{'date': 'January 2004'}, True, False, 100, None, None, True], [{'date': 'February 2004'}, False, False, 99, None, None, True]]
以上将打印:
true = True
最初我展示了定义变量(比如eval()
)并使用eval()
来解析它,但当然ast
是一个潜在的安全漏洞;因此,如果您需要解析可能来自网页或任何其他不受信任来源的文字,则需要花费少量精力导入ast.literal_eval()
并使用json
。
编辑:好的,True
模块可以解析这个;问题是使用true
代替False
和false
代替str.replace()
。只需使用json.loads()
方法函数来修复它们,然后.replace()
就可以解析它。
我正准备发布带有True
方法调用的代码片段,当问题再次更新时,大写的False
和s = '[[{"date":"January 2004"},true,false,100,null,null,true],[{"date":"February 2004"},false,false,99,null,null,true]]'
import json
x = json.loads(s)
print(x)
成为普通的合法JSON版本。< / p>
所以我的最终答案是:
[[{u'date': u'January 2004'}, True, False, 100, None, None, True], [{u'date': u'February 2004'}, False, False, 99, None, None, True]]
打印:
{{1}}