Python读取带有注释的JSON⽂件
Python 读取带有注释的JSON⽂件
在读取json⽂件时,有时会遇到⽂件中含有注释时,会报
Expecting property name: line 12 column 3 (char268)
意思即在⽂件12列3⾏处存在不符合JSON格式的字符,也就是注释。
要想解析这个JSON⽂件,必须要去除⽂件中的注释,在node.js中有专门去除注释的第三⽅包 strip-json-comments,但很可惜在python中不存在这样的包。
在⽹上到了⼀份代码
import json
import re
# Regular expression for comments
comment_re = repile(
'(^)?[^\S\n]*/(?:\*(.*?)\*/[^\S\n]*|/[^\n]*)($)?',
re.DOTALL | re.MULTILINE
)
def parse_json(filename):
""" Parse a JSON file
First remove comments and then use the json module package
Comments look like :
// ...
or
/*
...
*/
"""
with open(filename) as f:
content = ''.adlines())
## Looking for comments
match = comment_re.search(content)
while match:
# single line comment
content = content[:match.start()] + d():]
match = comment_re.search(content)
print content
# Return json file
return json.loads(content)
可以去除形如
// ....
/*
....
*/
的注释,但在去除第⼀种注释时,可能会有误伤,⽐如说JSON⽂件中有这样⼀个键值队
"url": "127.0.0.1:16666",
http: 后⾯的 //127.0.0.1:16666”则会被去除,看来还是得⾃⼰写⼀套
# 读取带注释 // /* */ 的json⽂件
def parse_json(self,filename):
""" Parse a JSON file
First remove comments and then use the json module package
Comments look like :
// ...
or
/*
...
*/
"""
res = []
f = open(filename)
python怎么读取json文件all_lines = f.readlines()
#去除形如 // 但不包括 ip_addr 的注释
for line in all_lines:
l = self.strip_comment(line)
res.append(l)
result = []
comment = False
#去除形如 /* */的注释
for l in res:
if l.find("/*") != -1:
comment = True
if not comment:
result.append(l)
if l.find("*/") != -1:
comment = False
#若直接使⽤ json.loads(str(res)) 会报 "ValueError: No JSON object could be decoded" str_res = ""
for i in result:
str_res += i
return json.loads(str_res)
def strip_comment(self,line):
#匹配IP地址的正则表达式
ip_re = repile('[0-9]+(?:\.[0-9]+){0,3}')
index = line.find("//")
if index == -1 :
return line
line_str = line[index + ]
if ip_re.search(line_str):
return line[:index+16] + self.strip_comment(line[index+17:])
else:
return line[:index] + self.strip_comment(line_str)
这份代码解决了上述问题。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论