将二维列表写入JSON文件

2024-04-04

我有一个二维列表,例如:

data = [[1,2,3], [2,3,4], [4,5,6]]

我想将其写入 JSON 文件,如下所示:

{
    'data':[
        [1,2,3],
        [2,3,4],
        [4,5,6]
    ]
}

我得到这个:json.dumps(data, indent=4, sort_keys=True):

{
    'data':[
        [
         1,
         2,
         3
        ],
        [
         2,
         3,
         4
        ],
        [
         4,
         5,
         6]
    ]
}

这是另一个问题使用 JSON 模块进行漂亮打印时如何实现自定义缩进? https://stackoverflow.com/questions/13249415/how-to-implement-custom-indentation-when-pretty-printing-with-the-json-module,但那是字典。


我以为你可以用我的答案 https://stackoverflow.com/a/13252112/355230到另一个类似的问题来做你想做的事。虽然它与json.dumps(),你指出由于某种原因它没有json.dump().

调查此事后,我发现encode()的推导方法json.JSONEncoder链接答案中被覆盖的类仅在以下情况下调用dumps()被调用,但不是在什么时候调用dump()叫做。

幸运的是,我能够确定iterencode() method does在这两种情况下都会被调用 - 因此能够通过或多或少简单地将代码从encode() to iterencode().

下面的代码是修改后的版本,其中包含以下更改:

Modified我对其他问题的回答中的代码版本:

from _ctypes import PyObj_FromPtr  # see https://stackoverflow.com/a/15012814/355230
import json
import re


class NoIndent(object):
    """ Value wrapper. """
    def __init__(self, value):
        if not isinstance(value, (list, tuple)):
            raise TypeError('Only lists and tuples can be wrapped')
        self.value = value


class MyEncoder(json.JSONEncoder):
    FORMAT_SPEC = '@@{}@@'  # Unique string pattern of NoIndent object ids.
    regex = re.compile(FORMAT_SPEC.format(r'(\d+)'))  # compile(r'@@(\d+)@@')

    def __init__(self, **kwargs):
        # Keyword arguments to ignore when encoding NoIndent wrapped values.
        ignore = {'cls', 'indent'}

        # Save copy of any keyword argument values needed for use here.
        self._kwargs = {k: v for k, v in kwargs.items() if k not in ignore}
        super(MyEncoder, self).__init__(**kwargs)

    def default(self, obj):
        return (self.FORMAT_SPEC.format(id(obj)) if isinstance(obj, NoIndent)
                    else super(MyEncoder, self).default(obj))

    def iterencode(self, obj, **kwargs):
        format_spec = self.FORMAT_SPEC  # Local var to expedite access.

        # Replace any marked-up NoIndent wrapped values in the JSON repr
        # with the json.dumps() of the corresponding wrapped Python object.
        for encoded in super(MyEncoder, self).iterencode(obj, **kwargs):
            match = self.regex.search(encoded)
            if match:
                id = int(match.group(1))
                no_indent = PyObj_FromPtr(id)
                json_repr = json.dumps(no_indent.value, **self._kwargs)
                # Replace the matched id string with json formatted representation
                # of the corresponding Python object.
                encoded = encoded.replace(
                            '"{}"'.format(format_spec.format(id)), json_repr)

            yield encoded

将其应用于您的问题:

# Example of using it to do get the results you want.

alfa = [('a','b','c'), ('d','e','f'), ('g','h','i')]
data = [(1,2,3), (2,3,4), (4,5,6)]

data_struct = {
    'data': [NoIndent(elem) for elem in data],
    'alfa': [NoIndent(elem) for elem in alfa],
}

print(json.dumps(data_struct, cls=MyEncoder, sort_keys=True, indent=4))

# Test custom JSONEncoder with json.dump()
with open('data_struct.json', 'w') as fp:
    json.dump(data_struct, fp, cls=MyEncoder, sort_keys=True, indent=4)
    fp.write('\n')  # Add a newline to very end (optional).

结果输出:

{
    "alfa": [
        ["a", "b", "c"],
        ["d", "e", "f"],
        ["g", "h", "i"]
    ],
    "data": [
        [1, 2, 3],
        [2, 3, 4],
        [4, 5, 6]
    ]
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将二维列表写入JSON文件 的相关文章

  • 实体创建无用的 id 字段

    我有一个CrudRepository与两个实体 Problem 特征实体总是创建一个附加的id数据库中的字段但未选择正确的characteristic id要生成的字段JSON machine entity machine id name
  • 检索 Steam 市场上物品的价格历史记录

    关于 Steam 市场上的物品 我想知道是否有办法检索某物品在一段时间内的价格历史记录 我知道 Steam 为想要将市场特定数据集成到自己网站中的开发人员提供了一个特殊的 api 但我还没有找到任何有关以 json 形式检索商品价格历史记录
  • MacOS Big Sur 中的 NPM 错误“找不到 Python 可执行文件”

    我已经花了整整一周的时间寻找这个问题的答案 但没有成功 我查看了每个 StackOverflow 帖子 Google 的每一篇文章以及我能找到的每个相关的 Github 问题 大多数相关错误似乎都比较旧 所以我想知道我的问题是否由于我使用的
  • Bug 组合:jQuery 1.4、ajax/json、Firebug Lite 和 IE 8

    我刚刚得出结论 无论我如何尝试 jQuery 的 ajax 调用都无法在 IE 8 中处理 JSON 数据 我发现我可以使用 jQuery 1 3 2 库 这解决了问题 但 1 4 根本无法处理 JSON ajax 请求 即使返回的 JSO
  • 如何检查给定的数字是否是2的幂?

    下面的代码不适用于某些输入 a i set 1 while i lt 10000 a add i i lt lt 1 N int input if N in a print True else print False 我最初的想法是检查每个
  • Plotly:如何设置文本格式(下划线、粗体、斜体)

    使用注释时 我尝试在绘图中为文本添加下划线 我使用添加注释 import plotly graph objects as go g go FigureWidget make subplots rows 1 cols 1 g update l
  • 解码Json数据数组并插入到mysql

    这个问题可能已经在这里问过 但我尝试搜索找不到它 我有如下 Json 数据 CityInfo CityCode 5599 Name DRUSKININKAI CityCode 2003 Name KAUNAS CityCode 2573 N
  • 如何停止 PythonShell

    如何终止 停止 Node js 中 PythonShell 执行的 Python 脚本的执行 我在交互模式下运行 输出通过 socket io 发送到给定的房间 如果没有更多的客户端连接到这个房间 我想停止 python 脚本的执行 这是我
  • 如何使用 Node.js 解析 JSON? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我应该如何使用 Node js 解析 JSON 是否有一些模块可以安全地验证和解析 JSON 你可以简单地使用JSON parse h
  • Pandas 根据条件替换数据框值

    我有一个主数据框 df Colour Item Price Blue Car 40 Red Car 30 Green Truck 50 Green Bike 30 然后我有一个价格修正数据框 df pc Colour Item Price
  • 类型错误:无法连接“str”和“int”对象有人可以帮助新手使用他们的代码吗?

    感谢任何帮助 还有任何重大缺陷或您在格式或基本方面看到的任何重大缺陷 请指出 谢谢 day raw input How many days locations raw input Where to days str day location
  • 在 Keras 中使用有状态 LSTM 训练多变量多级数回归问题

    我有时间序列P过程 每个过程的长度各不相同 但都有 5 个变量 维度 我试图预测测试过程的估计寿命 我正在用有状态的方法来解决这个问题LSTM在喀拉斯 但我不确定我的训练过程是否正确 我将每个序列分成长度的批次30 所以每个序列都是这样的形
  • 在基本 Tensorflow 2.0 中运行简单回归

    我正在学习 Tensorflow 2 0 我认为在 Tensorflow 中实现最基本的简单线性回归是一个好主意 不幸的是 我遇到了几个问题 我想知道这里是否有人可以提供帮助 考虑以下设置 import tensorflow as tf 2
  • 数据类和属性装饰器

    我一直在阅读 Python 3 7 的数据类 作为命名元组的替代品 我通常在必须将数据分组到结构中时使用它 我想知道数据类是否与属性装饰器兼容 以便为数据类的数据元素定义 getter 和 setter 函数 如果是这样 是否在某处进行了描
  • 如何在 Jupyter Notebook 中选择 conda 环境

    我安装了 Anaconda 5 3 和 Python 3 7 根环境 之后我使用 Python 3 6 创建了一个新环境 py36 我激活了新环境activate py36 conda env list表明环境是活跃的 但是当我启动 Jup
  • 如何通过 API Gateway 使用事件调用类型调用 Lambda 函数?

    文件说 默认情况下 Invoke API 采用 RequestResponse 调用类型 您可以选择通过将 Event 指定为 InitationType 来请求异步执行 因此 我可以发送到我的函数 python 的就是到处都是 Inspi
  • 如何从 Anaconda 更新 Pandas 以及最后是否可以使用 eclipse

    我已经使用以下文档通过 Anaconda 安装了 Python http www kevinsheppard com images 0 09 Python introduction pdf http www kevinsheppard co
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种
  • 基于 Web 请求在 Airflow 上运行作业

    我想知道是否可以在通过 HTTP 收到请求时执行气流任务 我对 Airflow 的调度部分不感兴趣 我只是想用它来代替芹菜 因此 示例操作如下所示 用户提交一份表格 请求某些报告 后端接收请求并向用户发送请求已收到的通知 然后后端使用 Ai
  • Python 中的可逆 STFT 和 ISTFT

    有没有通用的形式短时傅立叶变换 https en wikipedia org wiki Short time Fourier transform与内置于 SciPy 或 NumPy 或其他什么中的相应逆变换 这是pyplotspecgram

随机推荐

  • Composer/Laravel:如何添加/更新特定包

    如何使用 Composer 添加 更新特定包 我也在使用最新的 Laravel 不确定它是否重要 但任何可以帮助确定答案的东西 我还从我发现的旧 Stackoverflow 帖子中尝试了以下内容 但它对我不起作用 它将包附加到compose
  • 如何将 Docker Web 应用程序容器连接到 Docker PostgreSQL 容器?

    我正在练习制作一个与 PostgreSQL 数据库交互的 Golang Web 应用程序 每个应用程序都在自己的容器上运行 我正在运行容器docker compose up 但我似乎无法正确设置 postgres 容器 为了简洁起见 链接到
  • 在 MATLAB 中使用连续滑块的值

    我有点被困在这里了 我尝试阅读和实现一些简单的连续滑块脚本 像这个 https stackoverflow com questions 6032924 in matlab how can you have a callback execut
  • 如何延长 CloudBuild 超时

    我尝试了许多不同的选项来延长 CloudBuild 持续时间 但我的 gcloud 应用程序部署步骤总是在 10 分钟后超时 根据其他线程的提示 我在本地终端上尝试了此设置 gcloud config set app cloud build
  • 我应该使用 Selenium 还是 Jasmine 来使用 RSpec 测试视图文件?

    我使用 Ruby on Rails 3 2 2 cucumber rails 1 3 0 rspec rails 2 8 1 和 capybara 1 1 2 以及 Selenium 驱动程序 收到我的答复后上一个问题 https stac
  • 更改 SF 对象的 CRS

    我有一些 道路 作为 sp 对象 class SpatialLinesDataFrame features 17360 extent 490176 4 567680 9 148639 1 212821 xmin xmax ymin ymax
  • 在开始日期和结束日期之间 Firestore

    我的文件带有startDate and endDate 我想查询的范围之间startDate and endDate 我可以在一个日期的范围之间查询 如下所示 whereField startDate isGreaterThan start
  • 在 Android 编辑文本的提示上显示错误

    如果用户在编辑文本中输入空白值 我想显示错误 但是我不知道如何执行此操作 这就是我想要的方式 这是我创建的 xml
  • 使用滑动手势关闭键盘(如在消息应用程序中)

    当键盘显示在 iPhone 的消息应用程序上时 如果用户开始从消息表视图向下滑动并继续进入键盘区域 键盘将开始消失 如果他们在此过程中上下移动手指 键盘也会随之移动 Apple 是否使用私有 API 来做到这一点 或者有没有办法通过 我推测
  • 通过 Ctypes 将 std:vector 从 C++ 传递到 Python:获取无意义的值

    我试图遵循程序 https stackoverflow com a 14887649 8408902但我被困住了 我正在尝试通过std vector来自我的 C 代码 包含在extern C 到Python 这就是我所拥有的 extern
  • 如何同时加入 multiprocessing.Process() 列表?

    Given a list 跑步的multiprocessing Process 实例 我怎样才能加入所有实例并在其中一个实例退出时立即返回而没有Process join 超时和循环 Example from multiprocessing
  • IPv4 允许的最大 TCP/IP 网络端口号是多少?

    可以使用的最大端口号是多少 端口号是一个无符号 16 位整数 即 65535
  • 使用js删除html按钮

    我下面有一些代码 用于在 html 表单上创建一个按钮 当用户使用按钮输入一些信息时 我希望表单通过删除按钮并将其替换为纯文本来反映这一点 我尝试获取内部 html 并使用 div 但没有任何效果 有人可以帮忙吗 我并不是在寻找任何人为我编
  • 在 Python 中比较两个列表中的值

    在 Python 2 7 中 我有两个整数列表 x 1 3 2 0 2 y 1 2 2 3 1 我想创建第三个列表 指示每个元素是否x and y是相同的 产生 z 1 0 1 0 0 如何使用列表理解来做到这一点 我的尝试是 z i j
  • Scala 更新数组元素

    我从没想过我会问这么简单的问题 但是如何更新 scala 中的数组元素 我已经在我的 Main 对象中声明了内部函数 我有这样的东西 object Main def main args Array String def miniFunc n
  • Android FragmentStatePagerAdapter

    我正在使用 FragmentStatePagerAdapter这个例子 http developer android com reference android support v4 app FragmentStatePagerAdapte
  • Javascript 和 C# 舍入地狱

    如您所知 由于天才舍入规则C 我们得到以下值 decimal d 2 155M var r Math Round d 2 2 16 decimal d 2 145M var r Math Round d 2 2 14 现在在客户端Javas
  • 从另一个桌面捕获屏幕截图

    我使用创建了第二个桌面CreateDesktop我不会切换到它 我还在其中创建了一些进程 例如 Explorer exe 和 Winrar exe 接下来我有一个代码 它将当前桌面的屏幕截图保存到剪贴板 CreateDesktop 和 Sc
  • Javascript AJAX 功能在 IE 中不起作用?

    我有这个代码 function render message id var xmlHttp xmlHttp new XMLHttpRequest xmlHttp onreadystatechange function if xmlHttp
  • 将二维列表写入JSON文件

    我有一个二维列表 例如 data 1 2 3 2 3 4 4 5 6 我想将其写入 JSON 文件 如下所示 data 1 2 3 2 3 4 4 5 6 我得到这个 json dumps data indent 4 sort keys T