python解析json文件案例_Python加载带有注释的Json文件实例
由于json文件不支持注释,所以如果在json文件中标记了注释,则使用python中的json.dump()无法加载该json文件。
本文旨在解决当定义“//”为json注释时,如何正确解析有注释的json文件。
程序实现
# encoding: utf-8
import json
import re
import sys
reload(sys)
sys.setdefaultencoding('utf8')
CAUTION_PRINT_HEAD = 'caution: '
# 创建一个xstr类,用于处理从文件中读出的字符串
class xstr:
def __init__(self, instr):
self.instr = instr
# 删除“//”标志后的注释
def rmCmt(self):
qtCnt = cmtPos = slashPos = 0
rearLine = self.instr
# rearline: 前一个“//”之后的字符串,
# 双引号里的“//”不是注释标志,所以遇到这种情况,仍需继续查找后续的“//”
while rearLine.find('//') >= 0: # 查找“//”
slashPos = rearLine.find('//')
cmtPos += slashPos
# print 'slashPos: ' + str(slashPos)
headLine = rearLine[:slashPos]
while headLine.find('"') >= 0: # 查找“//”前的双引号
qtPos = headLine.find('"')
if not self.isEscapeOpr(headLine[:qtPos]): # 如果双引号没有被转义
qtCnt += 1 # 双引号的数量加1
headLine = headLine[qtPos+1:]
# print qtCnt
if qtCnt % 2 == 0: # 如果双引号的数量为偶数,则说明“//”是注释标志
# print self.instr[:cmtPos]
return self.instr[:cmtPos]
rearLine = rearLine[slashPos+2:]
# print rearLine
cmtPos += 2
# print self.instr
return self.instr
# 判断是否为转义字符
def isEscapeOpr(self, instr):
if len(instr) <= 0:
return False
cnt = 0
while instr[-1] == '\\':
cnt += 1
instr = instr[:-1]
if cnt % 2 == 1:
return True
else:
return False
# 从json文件的路径JsonPath读取该文件,返回json对象
def loadJson(JsonPath):
try:
srcJson = open(JsonPath, 'r')
except:
print CAUTION_PRINT_HEAD + 'cannot open ' + JsonPath
quit()
dstJsonStr = ''
for line in srcJson.readlines():
if not re.match(r'\s*//', line) and not re.match(r'\s*\n', line):
xline = xstr(line)
dstJsonStr += xline.rmCmt()
# print dstJsonStr
dstJson = {}
try:
dstJson = json.loads(dstJsonStr)
return dstJson
except:
print CAUTION_PRINT_HEAD + JsonPath + ' is not a valid json file'
quit()
# 带缩进地在屏幕输出json字符串
def printRes(resStr):
resStr = resStr.replace(',', ',\n')
resStr = resStr.replace('{', '{\n')
resStr = resStr.replace(':{', ':\n{')
resStr = resStr.replace('}', '\n}')
resStr = resStr.replace('[', '\n[\n')
resStr = resStr.replace(']', '\n]')
resStr = resStr
resArray = resStr.split('\n')
preBlank = ''
for line in resArray:
if len(line) == 0:
continue
lastChar = line[len(line)-1]
lastTwoChars = line[len(line)-2:]
if lastChar in {'}', ']'} or lastTwoChars in {'},', '],'}:
preBlank = preBlank[:len(preBlank)-2]
try:
print preBlank + line.decode('utf-8')
except:
print(preBlank + '[%This line cannot be decoded%]')
if lastChar == '{' or lastChar == '[':
preBlank += ' '*2
以上这篇Python加载带有注释的Json文件实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
python解析json文件案例_Python加载带有注释的Json文件实例相关推荐
- python读取json文件多个json数据_Python 加载包含多个JSON对象的JSON文件
defwriteJsonFile(data,outfilename): with open(outfilename+'.json', 'wt',encoding='utf-8') as f:for m ...
- python处理csv文件缺失值_python 加载数据是-1为缺失值时替换为空
最近在工作时,加载数据,原始数据用-1代表缺失值,之前加载的时候替换一直没有成功,后来直接把原文件的给改下,才去替换的. 今天 试了下如下方法,可行: 1. 加载数据时直接加载为str型: 2. 把- ...
- 用python的五种方式_Python加载数据的5种不同方式(收藏)
数据是数据科学家的基础,因此了解许多加载数据进行分析的方法至关重要.在这里,我们将介绍五种Python数据输入技术,并提供代码示例供您参考. 作为初学者,您可能只知道一种使用p andas.read_ ...
- python训练好的图片验证_利用keras加载训练好的.H5文件,并实现预测图片
我就废话不多说了,直接上代码吧! import matplotlib matplotlib.use('Agg') import os from keras.models import load_mod ...
- php动态引入js文件路径问题,JavaScript_动态加载外部css或js文件,原理解析:第一步:使用dom创 - phpStudy...
原理解析:第一步:使用dom创建 应用:1.提高代码的复用,减少代码量:2.添加一个javascript控制器和 session可以实现动态改变页面样式:3.由于是页面是从上到下依次加载文件的,并且边 ...
- 安卓加载asset中的json文件_Joomla 4中的Web资源介绍
Joomla 4中我最喜欢的改进之一是"Web资源"特性.它允许你通过一次调用按特定顺序加载一组JavaScript和CSS文件. 比方说,你希望加载依赖于其他文件的CSS或Jav ...
- python3读取网页_python3+selenium获取页面加载的所有静态资源文件链接操作
软件版本: python 3.7.2 selenium 3.141.0 pycharm 2018.3.5 具体实现流程如下,废话不多说,直接上代码: from selenium import webd ...
- GREENPLUM介绍之数据库管理(九)- 使用GPLOAD实现无落地文件的高速加载
GREENPLUM介绍之数据库管理(九)- 使用GPLOAD实现无落地文件的高速加载 类似于ORACLE SQL*LOADER,gpload是EMC在greenplum中提供的用来进行数据装载 ...
- javascript 文件的同步加载与异步加载
原文:[转载]javascript 文件的同步加载与异步加载 HTML 4.01 的script属性 charset: 可选.指定src引入代码的字符集,大多数浏览器忽略该值. defer: bool ...
最新文章
- 素数环问题---深度搜索遍历
- Spring的qualifier标签
- 微信公众平台开发之微信access_token如何有效长期保存
- c++ 中extern C 及#ifdef __cplusplus的作用
- C++一位的字符数字转数字
- ES6-Generator使用与改写
- idea导入java项目类上面显示红色的J符号解决办法
- SAP License:SD和其他模块集成要点
- CentOS安装PinPoint
- SQL Server AlwaysOn配置两个节点加共享文件夹仲裁见证
- SQLsever --数据库置疑
- Kali Linux工具大全-信息收集
- excel冻结窗格参与排序_冻结窗格以在Excel中隐藏行
- Spring——DI
- 小程序账号注册完整流程
- getchar()函数的作用
- 【1+X Web前端等级考证 】 | Web前端开发中级理论 (附答案)
- MAE学习 论文阅读与学习 源码阅读
- 如何做一名优秀的博士生:(二)方法论的转变
- java爬虫webcollector_JAVA爬虫框架:WebCollector
热门文章
- Ubuntu16.04 64位 + GTX1070显卡驱动 + CUDA 8.0
- ‘telnet‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
- mysql 索引 变慢_mysql添加索引,查询反而变慢
- 超郁闷的,2010年春节假期(农历新年)放假安排时间表
- Nginx——Nginx负载均衡
- Android如何跳转至目标Activity后按返回键不返回前一个Activity
- kali driftnet
- Golang中path/filepath包
- SDL入门教程(八):1、裁剪精灵图片(Clip Blitting and Sprite Sheets)
- 课题研究过程可能遇到的问题