python数据处理案例 带注释_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文件实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值