0

0

Python怎么将字典写入JSON文件_Python字典转JSON文件存储方法

下次还敢

下次还敢

发布时间:2025-09-17 21:37:01

|

491人浏览过

|

来源于php中文网

原创

Python字典转JSON文件广泛用于数据持久化、跨语言交换和配置管理,通过json.dump()直接写入文件或json.dumps()生成字符串再存储,结合ensure_ascii=False、indent格式化及default参数处理中文、美观输出与非标准类型,兼顾效率与可读性。

python怎么将字典写入json文件_python字典转json文件存储方法

Python要把字典(dictionary)存成JSON文件,最直接也最常用的方法就是利用内置的

json
模块。具体来说,就是用
json.dump()
这个函数,它能把你的Python字典对象直接序列化并写入到一个文件对象里,简单高效,是日常开发里处理数据存储和交换的利器。

解决方案:

import json
import datetime

# 假设我们有一个Python字典
data = {
    "name": "张三",
    "age": 30,
    "isStudent": False,
    "courses": ["Math", "Science"],
    "address": {
        "street": "科技园路1号",
        "city": "深圳"
    },
    "grades": None,
    "last_updated": datetime.datetime.now().isoformat() # datetime对象需要特殊处理,这里先转成ISO格式字符串
}

# 方案一:直接写入文件
file_path_dump = "output_data_dump.json"
try:
    with open(file_path_dump, 'w', encoding='utf-8') as f:
        # indent参数让JSON文件更易读,ensure_ascii=False允许写入非ASCII字符(如中文)
        json.dump(data, f, indent=4, ensure_ascii=False)
    print(f"字典已成功写入到 {file_path_dump}")
except IOError as e:
    print(f"写入文件时发生IO错误: {e}")
except TypeError as e:
    print(f"字典序列化时发生类型错误: {e}")

# 方案二:先转换成JSON字符串,再写入文件(适用于需要先处理JSON字符串的场景)
json_string = ""
try:
    # indent参数同样用于格式化字符串,ensure_ascii=False处理非ASCII字符
    json_string = json.dumps(data, indent=4, ensure_ascii=False)
    print("\n转换后的JSON字符串:\n", json_string)
except TypeError as e:
    print(f"字典序列化为字符串时发生类型错误: {e}")

file_path_string = "output_data_string.json"
if json_string: # 只有成功生成字符串才写入
    try:
        with open(file_path_string, 'w', encoding='utf-8') as f:
            f.write(json_string)
        print(f"JSON字符串已成功写入到 {file_path_string}")
    except IOError as e:
        print(f"写入文件时发生IO错误: {e}")

Python字典转换为JSON文件在实际应用中扮演什么角色?

说实话,在现代软件开发里,Python字典转JSON文件这事儿简直是家常便饭,它的重要性怎么强调都不为过。我个人觉得,这主要体现在几个方面:数据持久化、跨语言数据交换,还有就是配置管理。

你想啊,我们程序跑起来,内存里那些活生生的数据,比如用户设置、程序状态、抓取下来的信息,总不能程序一关就全没了对吧?这时候就需要把它们“固化”下来。JSON以其简洁、人类可读的特点,成了非常理想的载体。用

json.dump()
简单几行代码,就能把Python里那些灵活的字典结构,原封不动地保存到硬盘上,下次程序启动再读回来,简直不要太方便。这比什么自定义文本格式、CSV文件,处理复杂嵌套数据结构时要省心多了。

立即学习Python免费学习笔记(深入)”;

再说说跨语言数据交换。现在服务都是微服务架构,前端JavaScript、后端Python、Java,甚至移动端Swift、Kotlin,大家都要互相通信。JSON作为一种通用的、语言无关的数据格式,就成了那个“通用语”。Python字典序列化成JSON,前端可以直接解析,Java后端也能轻松反序列化成自己的对象。这种无缝衔接的能力,大大降低了不同技术栈之间协作的成本和复杂度。我曾经手头一个项目,需要Python脚本处理完数据后,把结果发给一个Node.js服务,JSON就是我们之间唯一的“桥梁”,效率很高。

最后还有配置管理。很多时候,我们不希望把所有配置都硬编码在代码里,而是希望通过一个外部文件来灵活调整。比如数据库连接信息、API密钥、各种开关参数。Python字典天生就能很好地表达这些键值对和嵌套结构,再一转成JSON文件,既方便人工编辑,也方便程序读取和更新。这比INI文件、XML文件,在表达复杂层级关系时,我觉得JSON更直观、更优雅。

json.dump()
json.dumps()
在文件存储场景下如何选择?

这俩函数,

json.dump()
json.dumps()
,虽然名字很像,功能也都是把Python对象转成JSON,但在实际使用场景里,它们的侧重点还是有点不同的。用哪个,得看你的具体需求。

json.dump(obj, fp, ...)
这个,它最直接的用途就是“把Python对象直接扔进文件里”。这里的
fp
是一个文件对象(file pointer),就是你用
open()
函数打开的那个文件句柄。它的好处是效率高,尤其是在处理大型数据字典的时候。它不需要先把整个JSON字符串在内存里完整地构建出来,再一股脑儿写入文件,而是可以边序列化边写入,这对于内存占用是个不小的优化。我的经验是,如果你确定最终目标就是要把数据存到文件里,而且不需要对JSON字符串本身做任何额外的处理(比如加密、压缩、网络传输),那么
json.dump()
就是你的首选,简单、直接、高效。

json.dumps(obj, ...)
呢,它的作用是“把Python对象转换成一个JSON格式的字符串”。注意了,它返回的是一个字符串,而不是直接写入文件。这个函数就灵活多了。什么时候用它?比如,你可能需要先把JSON数据通过网络请求发送出去,而不是存到本地文件;或者,你可能需要对生成的JSON字符串做一些额外的处理,比如打印到日志、作为某个API请求的body、或者在写入文件之前,先进行一些字符串替换或者编码转换。我个人在调试的时候也经常用
json.dumps()
,因为它能让我直接看到即将写入文件的JSON字符串长什么样,方便检查格式是否正确,或者在不实际写入文件的情况下,快速验证序列化逻辑。

ImgGood
ImgGood

免费在线AI照片编辑器

下载

举个例子,如果我有一个程序,它需要把处理结果存盘,同时也要通过HTTP POST请求把这个结果发送给另一个服务。那么,存盘我会用

json.dump()
,而发送请求时,我就会用
json.dumps()
生成JSON字符串作为请求体。你看,这俩函数虽然殊途同归,但各自有各自的战场。

写入JSON文件时如何处理编码、格式化及非标准数据类型?

在将Python字典写入JSON文件时,编码、格式化和非标准数据类型是几个非常常见的“坑”,也是优化用户体验和程序健壮性的关键点。

首先是编码问题。默认情况下,

json
模块在处理非ASCII字符时,会把它们转义成
\uXXXX
的形式。比如,中文的“你好”会变成
\u4f60\u597d
。这在一些场景下没问题,但如果你希望JSON文件内容直接显示中文,方便人类阅读,那就需要在
json.dump()
json.dumps()
时加上
ensure_ascii=False
这个参数。同时,别忘了在
open()
文件时,明确指定
encoding='utf-8'
。这是个很重要的细节,尤其是在跨系统、跨平台传输数据时,UTF-8是事实上的标准,能有效避免乱码问题。我以前就因为没注意这个,导致传给前端的JSON文件里中文全是转义字符,排查了半天才发现是
ensure_ascii
的问题。

其次是格式化。默认生成的JSON字符串或文件内容,可能都是紧凑的一行,没有换行和缩进,虽然机器读起来没问题,但人眼看起来就非常吃力。为了提高可读性,

json.dump()
json.dumps()
都提供了一个
indent
参数。比如,设置
indent=4
就会用4个空格进行缩进,让JSON结构清晰地分层显示。这对于调试、人工检查配置文件或者API响应来说,简直是福音。当然,如果你追求极致的文件大小或者网络传输效率,可以省略
indent
参数,让它保持紧凑。

最后,也是最容易让人头疼的,是非标准数据类型。JSON标准只支持字符串、数字、布尔值、

null
、数组和对象。Python字典里,我们经常会用到
datetime
对象、
set
集合,甚至是自定义的类实例。这些类型,
json
模块默认是不知道怎么序列化的,直接扔进去就会抛出
TypeError
。解决这个问题,有几种方法:

  1. 预处理数据:这是最直接的方式。在将字典传给

    json.dump()
    之前,手动把那些非标准类型转换成JSON支持的类型。比如,
    datetime
    对象可以转成ISO格式的字符串(
    datetime_obj.isoformat()
    ),
    set
    可以转成
    list
    。上面的代码示例里,我就把
    datetime.datetime.now()
    转成了字符串。

  2. 使用

    default
    参数
    json.dump()
    json.dumps()
    都有一个
    default
    参数,可以指定一个函数。当序列化器遇到无法处理的对象时,就会调用这个函数。你可以在这个函数里定义如何将你的自定义对象转换成JSON可识别的格式。这对于处理自定义类实例特别有用。

    import json
    import datetime
    
    class MyCustomClass:
        def __init__(self, value):
            self.value = value
    
    def custom_serializer(obj):
        if isinstance(obj, datetime.datetime):
            return obj.isoformat()
        if isinstance(obj, MyCustomClass):
            return {"_MyCustomClass_": obj.value} # 转换成字典
        raise TypeError(f"Object of type {obj.__class__.__name__} is not JSON serializable")
    
    data_with_custom = {
        "timestamp": datetime.datetime.now(),
        "custom_obj": MyCustomClass("hello world")
    }
    
    # 使用default参数
    json_output = json.dumps(data_with_custom, indent=4, default=custom_serializer, ensure_ascii=False)
    print("\n处理自定义类型后的JSON:\n", json_output)

    这个

    default
    参数非常强大,它提供了一个钩子,让你能优雅地扩展
    json
    模块的序列化能力。我建议,如果你经常需要序列化一些特定但非标准的对象,封装一个通用的
    default
    函数会非常方便,避免每次都手动转换。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

332

2026.03.03

Kotlin协程编程与Spring Boot集成实践
Kotlin协程编程与Spring Boot集成实践

本专题围绕 Kotlin 协程机制展开,深入讲解挂起函数、协程作用域、结构化并发与异常处理机制,并结合 Spring Boot 展示协程在后端开发中的实际应用。内容涵盖异步接口设计、数据库调用优化、线程资源管理以及性能调优策略,帮助开发者构建更加简洁高效的 Kotlin 后端服务架构。

130

2026.02.12

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

338

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

225

2025.10.31

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MongoDB 教程
MongoDB 教程

共17课时 | 3.3万人学习

Swoft2.x速学之http api篇课程
Swoft2.x速学之http api篇课程

共16课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号