json file类型_python csv、json、pickle数据持久化

一. csv/json/pickle基本概念

csv:CSV(Comma Separated Values)格式是电子表格和数据库最常见的导入和导出格式。用文本文件形式储存的表格数据,可以使用excel打开,易于阅读,

json:数据交换格式。用于提升网络传输效率,可以字符串和python之间的转换,可用于网页上这种数据传输,支持跨语言

pickle:pickle模块实现了用于对Python对象结构进行序列化和反序列化的二进制协议,人类无法识别

在pickle协议和JSON(JavaScript对象表示法)之间存在根本区别:

  • JSON是一种文本序列化格式(它输出unicode文本,虽然大多数时候它被编码为utf-8),而pickle是一个二进制序列化格式;
  • JSON是人类可读的,而pickle不是;
  • JSON是可互操作的,并且在Python生态系统之外广泛使用,而pickle是特定于Python的;
    默认情况下,JSON只能表示Python内建类型的一个子集,并且没有自定义类; pickle可以代表极大数量的Python类型
    其中许多是通过巧妙地使用Python内省功能自动实现的;复杂的情况可以通过实现specific object APIs来解决。

二 csv/json/pickle基本使用方法

1. csv

(1. csv模块API说明

csv模块的reader和writer对象读取和写入序列。程序员还可以使用DictReader和DictWriter类以字典形式读取和写入数据。
csv模块定义以下函数:1.csv.reader(csvfile, dialect='excel', * * fmtparams)

  • 返回一个读取器对象,它将在给定的csvfile中迭代。csvfile可以是任何支持iterator协议的对象,并且每次调用 __ next __ ()方法时返回一个字符串 - file objects和列表对象都是合适的。
  • 如果csvfile是文件对象,则应使用newline=''打开它。如果没有使用newline="",写到文件中会在每行结束加个t换行符2.csv.writer(csvfile, dialect='excel', * * fmtparams)
    返回一个writer对象,可以使用writerow(data),writerows(datas)
    csv模块定义以下类:

(1.class csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, * *kwds)
创建一个对象,其操作类似于普通读取器,但将读取的信息映射到一个dict中,其中的键由可选的fieldnames参数给出。
fieldnames参数是一个sequence,其元素按顺序与输入数据的字段相关联。这些元素成为结果字典的键。

(2.class csv.DictWriter(csvfile, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, * *kwds)
创建一个操作类似于常规writer的对象,但将字典映射到输出行。
fieldnames参数是一个sequence,用于标识传递给writerow()方法的字典中的值被写入csvfile。
如果传递给writerow()方法的字典包含fieldnames中未找到的键,则可选的extrasaction参数指示要执行的操作。

(2.csv具体代码示例

3bb424d785131e3535c321366838a03e.png

2. json简单使用介绍

(1. json模块API说明

python转换json

7f0f9cc1e17793c79a1756130515f43a.png

1.将obj序列化为fp,json模块总是产生str对象,而不是bytes对象。因此,fp.write()必须支持str输入。

2.如果 skipkeys 的值为 true (默认为: False), 那么不是基本类型 (str, int, float, bool, None)的字典键将会被跳过, 而不是引发一个 TypeError 异常.

3.如果indent是非负整数或字符串,缩进

4.separator = (item_separator, key_separator),默认(',',':')

5.sort_keys为真(默认值:False),则字典的输出将按键排序。

6.遇见复杂的python无法转换时使用default参数,覆盖default()方法以序列化其他类型

09ddbbf617dbb276df3bc01175277668.png

同上用法

json转换python

c95095885474d77fb780fb595f3faf32.png

1.object_hook是一个可选的函数,它将被任何对象字面值解码(dict)的结果调用。

2.parse_float(如果指定)将使用要解码的每个JSON浮点的字符串进行调用。

fda765d950114b57a5b18ea39fba6b91.png

同上用法

对于复杂的结构我们可以自定义解码和编码

3204d7c313dd847d2cd74bf66d419403.png

(2. json具体使用示例

60ea195377559a8f33f961954a97b575.png

3.pickle使用

(1.pickle模块API说明

pickle模块实现了用于对Python对象结构进行序列化和反序列化的二进制协议

1.pickle.dump(obj, file, protocol=None, *, fix_imports=True)
将obj的腌制表示写入打开的file object 文件。这相当于Pickler(文件, 协议).dump(obj)。

2.pickle.dumps(obj, protocol=None, *, fix_imports=True)
将对象的腌制表示作为bytes对象返回,而不是将其写入文件。

3.pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict")
从打开的文件对象file读取pickled对象表示形式,并返回其中重新构建的对象层次结构。它等同于Unpickler(file).load()。

4.pickle.loads(bytes_object, *, fix_imports=True, encoding="ASCII", errors="strict")
从bytes对象读取腌制对象层次结构,并返回其中指定的重构对象层次结构。

(2.pickle具体示例

e418381c82afe9dcd7b6a67cae4799fa.png

三.使用场景

1.pickle主要用于存储计算过数据,保存下来下次使用直接获取,特点是他的读写效率高于一般文件,存储大小也更小
2.json主要用于网络直接传递数据,存储一些结构化数据
3.CSV 通常用于在电子表格软件和纯文本之间交互数据。实际上,CSV 都不算是一个真正的结构化数据,CSV 文件内容仅仅是一些用逗号分隔的原始字符串值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的pickle模块是用来实现序列的,即将Python中的对象转换成字节流,方便存储和传输。pickle模块支持多种协议,其中协议0是最早的版本,协议1和协议2是Pyhton2中引入的,协议3是Python3.0中引入的,协议4是Python3.4中引入的,每个协议都有其特点和适用范围。 下面我们来详细了解一下pickle模块的使用方法和各个协议的特点。 ## 基本用法 pickle模块提供了dumps、dump、loads和load四个函数,分别用来进行序列和反序列操作。其中dumps和loads函数可以直接将对象转换成字节流或将字节流转换成对象,而dump和load函数则可以将对象序列到文件或从文件中反序列对象。 ### 序列 将Python对象转换成字节流的过程称为序列,可以使用dumps函数实现: ```python import pickle data = {'name': 'Tom', 'age': 18, 'gender': 'male'} bytes_data = pickle.dumps(data) print(bytes_data) ``` 输出结果为: ``` b'\x80\x04\x95\x17\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x03Tom\x94\x8c\x03age\x94K\x12\x8c\x06gender\x94\x8c\x04male\x94u.' ``` 可以看到,data字典被转换成了一串二进制的字节流。 ### 反序列 将字节流转换成Python对象的过程称为反序列,可以使用loads函数实现: ```python import pickle bytes_data = b'\x80\x04\x95\x17\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x03Tom\x94\x8c\x03age\x94K\x12\x8c\x06gender\x94\x8c\x04male\x94u.' data = pickle.loads(bytes_data) print(data) ``` 输出结果为: ``` {'name': 'Tom', 'age': 18, 'gender': 'male'} ``` ### 文件操作 除了使用dumps和loads函数进行序列和反序列操作外,pickle模块还提供了dump和load函数用于将对象序列到文件或从文件中反序列对象。 将对象序列到文件: ```python import pickle data = {'name': 'Tom', 'age': 18, 'gender': 'male'} with open('data.pkl', 'wb') as f: pickle.dump(data, f) ``` 从文件中反序列对象: ```python import pickle with open('data.pkl', 'rb') as f: data = pickle.load(f) print(data) ``` ## 协议0 协议0是最早的版本,它使用ASCII码来表示序列后的对象,因此序列后的数据比较大。使用协议0时,可以指定文件打开模式为't',表示以文本模式打开文件: ```python import pickle data = {'name': 'Tom', 'age': 18, 'gender': 'male'} with open('data.pkl', 'wt') as f: pickle.dump(data, f, protocol=0) with open('data.pkl', 'rt') as f: data = pickle.load(f) print(data) ``` 输出结果为: ``` {'age': 18, 'gender': 'male', 'name': 'Tom'} ``` ## 协议1 协议1和协议2是Python2中引入的,它们使用更紧凑的二进制格式表示序列后的对象。协议1可以指定文件打开模式为'wb',表示以二进制模式打开文件: ```python import pickle data = {'name': 'Tom', 'age': 18, 'gender': 'male'} with open('data.pkl', 'wb') as f: pickle.dump(data, f, protocol=1) with open('data.pkl', 'rb') as f: data = pickle.load(f) print(data) ``` 输出结果为: ``` {'name': 'Tom', 'age': 18, 'gender': 'male'} ``` ## 协议2 协议2是协议1的改进版本,它支持新的对象类型,如集合、字典等。在Python2中,协议2是默认使用的协议,如果不指定协议号,则使用协议2。 在Python3中,pickle模块默认使用协议3,但仍然可以使用协议2: ```python import pickle data = {'name': 'Tom', 'age': 18, 'gender': 'male'} with open('data.pkl', 'wb') as f: pickle.dump(data, f, protocol=2) with open('data.pkl', 'rb') as f: data = pickle.load(f) print(data) ``` 输出结果为: ``` {'name': 'Tom', 'age': 18, 'gender': 'male'} ``` ## 协议3 协议3是Python3.0中引入的,它支持更多的对象类型,如bytes、bytearray、set等。在Python3中,协议3是默认使用的协议,因此可以省略protocol参数: ```python import pickle data = {'name': 'Tom', 'age': 18, 'gender': 'male'} with open('data.pkl', 'wb') as f: pickle.dump(data, f) with open('data.pkl', 'rb') as f: data = pickle.load(f) print(data) ``` 输出结果为: ``` {'name': 'Tom', 'age': 18, 'gender': 'male'} ``` ## 协议4 协议4是Python3.4中引入的,它支持更多的对象类型,如memoryview、tuple等。协议4还支持从流中读取指定长度的数据,从而避免了一次性读取太多数据导致内存溢出的问题。 使用协议4时,需要将文件打开模式指定为'xb',表示以二进制模式打开文件,并且不能使用文本模式: ```python import pickle data = {'name': 'Tom', 'age': 18, 'gender': 'male'} with open('data.pkl', 'xb') as f: pickle.dump(data, f, protocol=4) with open('data.pkl', 'rb') as f: data = pickle.load(f) print(data) ``` 输出结果为: ``` {'name': 'Tom', 'age': 18, 'gender': 'male'} ``` ## 注意事项 在使用pickle模块时,需要注意以下几点: - 序列和反序列的对象必须是可序列的,即不能包含不能序列的对象。 - 序列和反序列的对象必须是相同的类型,否则可能会出现错误。 - 序列和反序列的对象必须是可信的,否则可能会被注入恶意代码。 - 不同协议之间的兼容性不同,不同协议之间的序列和反序列操作不一定是互逆的。因此,在使用不同协议时,需要注意协议号的兼容性和相应的操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值