python之json格式化与紧凑处理

格式化

在工作中json是我们常用的数据格式,因为格式化与紧凑存储所占的内存是不同的,格式化存储接近大一倍空间。所以有时候需要紧凑存储(一行存储),但是查看不太方便。

场景:

  1. 记事本打开json的速度最快,但是没有格式化功能。
  2. notepad++可以格式化但是需要联网安装插件,内网环境不能下载
  3. vscode自带格式化功能,右键->格式化,但是成千上万的文件操作拉低效率

所以,可以通过python脚本将json在格式化与紧凑之间互相转换

以下以python3为例

#coding=utf-8
import json
import os
import sys
import io

# 遍历所有文件夹下的文件
#sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')         #改变标准输出的默认编码

def getFileCon(filename):
  if not os.path.isfile(filename):
    return

  with open(filename, encoding="utf_8_sig") as f:
    con = f.read()
    f.close()
    return con

def writeFile(filepath,con):
  with open(filepath, "w") as f:
    f.write(con)
    f.close()

#递归的找出目表路径下的所有文件
def get_files(dirName):
    for filepath,dirnames,filenames in os.walk(dirName):
        return filenames


if __name__ == "__main__":
  # fl = get_files(".")
  filePath = '.'
  for filepath, dirnames, filenames in os.walk(filePath):
      for f in filenames:
        g = os.path.join(filepath, f)
        # print(g)
        if os.path.isdir(g):
            print(g + " it's a directory")

        elif os.path.isfile(g):
            # print(g + " it's a normal file")
            if not f.endswith(".json"):
                continue

        try:
            con = json.loads(getFileCon(g))
            # print(con)
            # writeFile(g,json.dumps(con,indent=4,ensure_ascii=False).decode('utf8'))
            writeFile(g, json.dumps(con, indent=4, ensure_ascii=False))
            print(g, 'OK')
        except Exception as e:
            print(g, e)

将此脚本拷贝到 指定目录下,然后cmd,执行 python formatjsonAll.py,该目录(包括子目录)下的所有json文件将格式化

紧凑

#coding=utf-8
import json
import os
import sys
import io

# 遍历所有文件夹下的文件
#sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')         #改变标准输出的默认编码

def getFileCon(filename):
  if not os.path.isfile(filename):
    return

  with open(filename, encoding="utf_8_sig") as f:
    con = f.read()
    f.close()
    return con

def writeFile(filepath,con):
  with open(filepath, "w") as f:
    f.write(con)
    f.close()

#递归的找出目表路径下的所有文件
def get_files(dirName):
    for filepath,dirnames,filenames in os.walk(dirName):
        return filenames


if __name__ == "__main__":
  # fl = get_files(".")
  filePath = '.'
  for filepath, dirnames, filenames in os.walk(filePath):
      for f in filenames:
        g = os.path.join(filepath, f)
        # print(g)
        if os.path.isdir(g):
            print(g + " it's a directory")

        elif os.path.isfile(g):
            # print(g + " it's a normal file")
            if not f.endswith(".json"):
                continue

        try:
            con = json.loads(getFileCon(g))         
            # print(con)
            outfile= open(g, "w")
            json.dump(con,outfile,ensure_ascii=False)
            outfile.close()
    
            print(g, 'OK')
        except Exception as e:
            print(g, e)

Json.dump用法

json.dumps()是把python对象转换成json对象的一个过程,生成的是字符串。
json.dump()是把python对象转换成json对象生成一个fp的文件流,和文件相关。

outfile= open(g, "w")
json.dump(con,outfile,ensure_ascii=False)
outfile.close()

# g是文件名,con是json数据,ensure_ascii=True:默认输出ASCLL码,如果把这个该成False,就可以输出中文。

参考:

Python json.dump()实例讲解

json.dump方法

 

posted @ 2023-04-08 11:51  peterYong  阅读(1387)  评论(0编辑  收藏  举报