-----世界上本来没那么多坑,python更新到3以后坑就多了

无论哪一门语言开发,都离不了数据储存与解析,除了跨平台性极好的xml和json之外,python要提到的还有自身最常用pickle模块。在使用上,python的常用模块接口漂亮而简单,而且json跟pickle二者使用一模一样。首先来看一下用法,代码如下:

import json,pickle #导入模块。
data = {
'name' : "lixin",
'sex' :"female",
'height':1.58,
'weight':82,
'utterance':'奏是这么瘦,来打我啊'
}
jsondata = json.dumps(data) #转json数据
pythondata1 = json.loads(jsondata) #json数据转python
print(pythondata1)
pickledate = pickle.dumps(data)#转持久化数据
pythondata2 = pickle.loads(pickledate)#转回python
print(pythondata2)

  

以上代码,在python3.5里运行无误,utf-8编码汉字可识别。然而,大多数时候,数据的解析不仅仅是使用,更多的是为了储存。无关联型大多储存形式是以文本储存,因此我们需要把数据写入文本。python的常规文本写入是只支持字符串的,json和pickle在写入文本都有自己的方法接口,和普通数据转换接口也极好区分,去掉末尾的s即可。代码如下:

with open("jsondata.json","w") as file: #打开一个名为jsondata.json文本,只能写入状态 如果没有就创建
json.dump(data,file) #data转换为json数据格式并写入文件
file.close()#关闭文件
with open("jsondata.json","r") as file:#打开文本读取状态
l = json.load(file) #解析读到的文本内容 转为python数据 以一个变量接收
print(l) #打印变量
file.close() #关闭文件

  pickle的使用方式基本一样只是写入的文本格式为txt或者pk。当然json也可以直接写入txt。以上代码在python3.5运行无误(不排除人品不好)。看起来简洁方便,似乎毫无难点,那么来愉快的谈一下使用中常见的坑

不管你要读什么,反正我一点数据也没有:

Traceback (most recent call last):
File "/Users/penglong/Documents/python/s10/day3/test.py", line 13, in <module>
l = json.load(file)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py", line 268, in load
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py", line 319, in loads
return _default_decoder.decode(s)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 357, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

  报错如上,原因十分明显,json没有内容可解析,一般直接从文件中进行排除,会发现读取的文本是空白,也就是说在写入数据的时候就已经发生了错误。但代码并没有报错,如果没有进行写入检测的话,差不多就卡这了,这个原因很简单,大部分是因为在写入时候调用的接口是dumps而不是dump,程序本身可以编译通过,但实际上没有文本写入。导致读取的时候直接报错。如果遇到这个问题,去排查一下写入数据时调用的接口。

不管你要我写什么,反正我就是写不进去:

  File "/Users/penglong/Documents/python/s10/day3/test.py", line 17, in <module>
pickle.dump(data,file)
TypeError: write() argument must be str, not bytes

  报错如上,此错误针对pickle写入,原因也很明显,写入必须是字符串,我猜json不报错的原因很大程度是因为它长的比较像字符串。。忽略这个不靠谱的想法。这个引发的错误留给下一个。解决代码如下:(ps:在2.7里面敲是没遇到这个毛病的,在3.5里面一定要在"wb"状态下才能正常写入。)

with open("pickle.pk","wb") as file: #改参数"w"为"wb" 代表二进制写入
pickle.dump(data,file)
file.close()

以上,json的错误完全相反,可能报错为TypeError: a bytes-like object is required, not 'str',完全不用举例了,是踩进了pickle的坑里,直接把"wb"状态改回"w"即可解决。然而总有那么些时候并不在意强扭的瓜甜不甜,仅仅是想强行把它给扭下来。假如犯了强迫症,一定要在wb的状态下使用,那么,解决代码如下:(ps:严重不推荐使用。。其实就是我半天不知道毛病在哪,头痛医头脚痛医脚,不管原因,强行把它给写进去了,虽然运行和结果都没错,但肯定有什么地方不对)

with open("jsondata.json","wb") as file:
file.write((json.dumps(data).encode("utf-8")))#强制以utf-8转一下byte数据再以普通形式写入 。
file.close()

不管你要做什么,反正我就是没有函数存在:

Traceback (most recent call last):
File "/Users/penglong/Documents/python/s10/day3/test.py", line 10, in <module>
json.dumps(data,file)
AttributeError: module 'json' has no attribute 'dumps'

  报错如上,json没有dumps模块存在。排查本地文件,大部分原因是本地文件有了json.py。python的包导入直接先导入了同级目录下的文件。如果本地文件并没有重复,那么就只能排查安装文件了,python命令行编辑模式下help(json.py) 如果文件存在,可以看到其详细信息和存放位置。但安装文件丢失的情况,我并未遇到。踩到的坑是本地文件重复,反而在安装文件排查了好久。 

其实还遇到好几个,可等熟悉了想要故意掉坑里,却进不去了。大概,在没有走的够远之前路上都是坑。

关于python数据序列化的那些坑的更多相关文章

  1. python 数据序列化(json、pickle、shelve)

    本来要查一下json系列化自定义对象的一个问题,然后发现这篇博客(https://www.cnblogs.com/yyds/p/6563608.html)很全面,感谢作者,关于python序列化的知识 ...

  2. Python基础4 迭代器,生成器,装饰器,Json和pickle 数据序列化

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  3. Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化

    一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...

  4. Python之数据序列化(json、pickle、shelve)

    本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Py ...

  5. python基础6之迭代器&生成器、json&pickle数据序列化

    内容概要: 一.生成器 二.迭代器 三.json&pickle数据序列化 一.生成器generator 在学习生成器之前我们先了解下列表生成式,现在生产一个这样的列表[0,2,4,6,8,10 ...

  6. Python【第五课】迭代器,生成器,数据序列化

    本节内容 列表生成式,生成器,迭代器 Json & pickle 数据序列化 1.列表生成式,生成器,迭代器 1.1 列表生成式 列表生成式?不就是生成个列表的表达式,恩~~~ 差不多. 一般 ...

  7. 【转】Python之数据序列化(json、pickle、shelve)

    [转]Python之数据序列化(json.pickle.shelve) 本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型 ...

  8. Python学习笔记:json模块和pickle模块(数据序列化)

    Python中的json模块和pickle都是用于数据的序列化和反序列化,它们提供的方法也是一样的:dumps,dump,loads,load dumps(obj):将对象序列化为str. dump( ...

  9. python学习之 -- 数据序列化

    json / pickle 数据序列化 序列化定义:把变量从内存中变成可存储或传输的过程称为序列化.反序列化:把变量内容从序列化的对象重新读到内存里称为反序列胡. 序列化模块之--pickle使用注意 ...

随机推荐

  1. 疯狂JAVA16课之对象与内存控制

    java内存管理分为两个方面:内存分配和内存回收.这里的内存分配特指创建java对象时JVM为该对象在对内存中所分配的内存空间.内存回收指的是当该java对象失去引用,变成垃圾时,JVM的垃圾回收机制 ...

  2. Beta阶段项目终审报告

    先上图 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件主要是用来解决玩狼人杀这款桌游时无牌.无法官.游戏流程不熟悉等情况的.我觉得我们对典型 ...

  3. noip2012 开车旅行

    此题100分的解法就是先预处理出每个点的下一个点之后倍增就好了.其实并没有太大难度. pbihao用双向链表写过了此题.在本地上我treap狂操他,but在rqnoj上,我依靠反复提交才A掉此题(最后 ...

  4. JavaScript If...Else 语句

    JavaScript If...Else 语句 JavaScript的开头和结束标签: <script type="text/javascript"></scri ...

  5. New Plan!

    很久无写过blogs,荒废得差不多了,在博客园虽开bolg 5年多,但由于自己工作的问题,从开始的热情记录,到冷却冰冻,再到现在重拾起来,有一番感受:从大学刚毕业的制作网页菜鸟,开始接触DIV,CSS ...

  6. Mybatis学习总结(一)——入门基础

    一.Mybatis介绍 1.MyBatis是什么? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了go ...

  7. nuget国内镜像的解决办法

    不求人,在阿里云上安一个nuget镜像站,这样就能愉快编程了. 主要是利用nginx 的反向代理+缓存功能+响应文本的替换 proxy_cache_path /data/nuget-cache lev ...

  8. Excel—如何解决数组求和运算时行列不匹配产生的错误

    1.如下所示: 使用SUM对两个数组A1:B2,C1:E3进行运算时,由于行列不匹配返回了错误值. 2.可通过使用IFERROR进行解决. 对判断生成的错误值,通过用0替代进行解决. 3.除以上外,由 ...

  9. FFmpeg-for IOS 一[安装]

    FFmpeg编译环境搭建 准备 下载 gas-preprocessor 下载 ffmpeg包,ffmpeg 安装yasm,先安装homebrew,输入:ruby -e "$(curl -fs ...

  10. 【转】PHP网站(nginx、php-fpm、mysql) 用户权限解析

    这篇文章我们就特别来讲解下,nginx.php-fpm 以及 mysql 运行在各个用户下的配置. 先来做个说明:nginx本身不能处理PHP,它只是个web服务器.当接收到客户端请求后,如果是php ...