python实现将二维数组有序的写入json文件(不使用json库)

1 篇文章 0 订阅
1 篇文章 0 订阅
最近再用pygame开发一个2d的RPG小游戏,  地图是用二维数组的形式保存的, 就像这样:👇
map2d = {
    "map":[
		[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
		[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
		[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
		[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
		[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
		[13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
		[13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
		[13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
		[13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
		[13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
		[13, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 13],
		[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
		[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
		[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
    ],
    .....
}

编辑地图的时候肯定不能用纯手工修改, 那么就还得自己写一个地图编辑器了. 这时候使用python自带的json库 json.dump的话 就会出现换行格式不美观:如下

"map": [
        [
            13,
            13,
            13,
            13,
            13,
            13,
            13,
            13,
            13,
            13,
            13,
            13,
            13,
            13
        ],
        [
            13,
            11,
            ........
        ]

这时候程序读数据当然是没问题的, 但是强迫症表示浑身不舒服… 找了半天的百度以及用chatgpt提供的 修改 dump的参数 separators=(“,”,“:”),也还是不起作用. 没办法自己动手丰衣足食:
python代码实现如下:

import json

a = {
    "map":[
		[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
		[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
		[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
		[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
		.....
    ],
    "yiwei": [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17]
}

res = "{\n"
# 缩进
indent = 4
# 当前的遍历的位置
index = 0
# 当前字典(json数据) 的可迭代长度
keyLen = len(a.keys())

for i in a:
	# 得到当前值
	info = a[i]
	# 获取到当前值的类型
	dataTp = type(info)
	# 给末尾添加的额外元素
	endStr = ",\n"
	# 如果当前值是数组, 需要特殊处理
	if dataTp == list:
		# 判断数组的第一个元素是否是 二维数组,这里只实现 二维数组的方法, 一维数组直接写入, 其他多维的数组方法同理
		# 实现的功能是保存 用二维数组渲染的游戏地图, 所以子元素的类型都一致,只用判断一个就行
		if type(info[0]) == list:
			info = "[\n"
			lIndex = 0
			# 属于更下一级的子元素, 缩进需要再进一步
			indent *= 2
			for ci in a[i]:
				# 判断是否到了迭代的末尾, 末尾的数据就不用加 逗号和换行了
				if lIndex == len(a[i]) -1:
					endStr = ""
				# else:
				info += " "*indent+f"{ci}{endStr}"
				# 遍历位置+1
				lIndex += 1
				
			info += "\n]"
			endStr = ",\n"
			#  结束二维数组的处理之后, 将缩进改回来
			indent = 4
	# 根据当前行的数据类型判断是否需要 加上双引号包裹起来
	if dataTp != dict and dataTp != list:
		info = f'"{info}"'

	if index == keyLen -1:
		endStr = ""
	# 将当前行的最终数据追加到res
	res += " "*indent+f'"{i}": {info}{endStr}'
	index += 1

res += "\n}"
with open("data.json", "w") as f:
	f.write(res)

这下文件内容的格式看起来就舒服多了

{
    "map": [
        [13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
        [13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
        [13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
        [13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
        [13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
        [13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
        [13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
        [13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
        [13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
        [13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
        [13, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 13],
        [13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
        [13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
        [13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13]
],
    "yiwei": [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17]
}

以上代码截止: 2023/3/26 运行无误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将三维数组保存为JSON格式的文件可以通过以下步骤完成: 1. 导入Pythonjson和numpy 2. 将三维数组转换为Python中的字典类型,使用numpy中的tolist()方法将numpy数组转换为Python列表 3. 打开一个文件使用Python的open()函数打开文件并传入参数"wb"(二进制写模式) 4. 将字典类型转换为JSON格式,使用json中的dumps()方法将字典类型转换为JSON格式的字符串 5. 将JSON字符串写入文件使用Python的write()方法将JSON字符串写入文件中 6. 关闭文件 以下是一个示例代码,假设我们要将一个名为data的三维数组保存到名为data.json文件中: ```python import json import numpy as np data = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) # 将三维数组转换为Python中的字典类型 data_dict = {'data': data.tolist()} with open('data.json', 'wb') as jsonfile: # 将字典类型转换为JSON格式 json_str = json.dumps(data_dict) # 将JSON字符串写入文件 jsonfile.write(json_str.encode('utf-8')) ``` 这个代码会将三维数组[[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]保存为JSON格式的文件data.json。我们使用了二进制模式('wb')打开文件,在写入文件之前将字典类型转换为JSON格式的字符串,并将字符串写入文件。需要注意的是,json.dumps()方法返回的是一个字符串,需要使用encode()方法将字符串转换为字节类型才能写入文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值