这里有新鲜出炉的 Python3 Cookbook 中文版, 程序狗速度看过来!
Python 编程语言
Python 是一种面向对象, 解释型计算机程序设计语言, 由 Guido van Rossum 于 1989 年底发明, 第一个公开发行版发行于 1991 年. Python 语法简洁而清晰, 具有丰富和强大的类库. 它常被昵称为胶水语言, 它能够把用其他语言制作的各种模块 (尤其是 C/C++) 很轻松地联结在一起.
今天小编就为大家分享一篇 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
来源: http://www.phperz.com/article/19/0514/365996.html