当前位置: 首页 > 后端技术 > Python

连载(连载)

时间:2023-03-26 17:12:21 Python

GitHub@orca-j35,所有笔记托管在python_notes仓库欢迎任何形式的转载,但请务必注明出处。参考:https://pythonguidecn.readthe...https://docs.python-guide.org...https://codingpy.com/books/th...本文结束于https://pythonguidecn。阅读。..为基础,又增加了一些内容序列化是指将“结构化数据”转换为“可存储格式”的过程,反向转换过程称为反序列化。例如,在Python中,结构化数据对象dict不能直接存储在文件中:a={"Type":"A","field1":"value1","field2":"value2","field3":"value3",}withopen('./file.txt','w')asf:f.write(a)#>TypeError:write()argumentmustbestr,notdict但是我们可以通过序列化来操作,将dict对象转换为某种可存储格式。例如可以将dict对象通过序列化操作转换为字符串序列,从而实现dict对象的存储:a={"Type":"A","field1":"value1","field2"":"value2","field3":"value3",}print(repr(a))#repr()可以理解为序列化方法#>{'Type':'A','field1':'value1','field2':'value2','field3':'value3'}withopen('./file.txt','w')asf:f.write(repr(a))#序列化的dict对象可以写入文件importastwithopen('./file.txt','r')asf:b=ast.literal_eval(f.readline())print(f'{type(b)}:{b}')#>:{'Type':'A','field1':'value1','field2':'value2','field3':'value3'}在某些情况下,序列化第二个目的是减少数据大小,从而减少磁盘和带宽需求。Flatvs.Nesteddata在开始序列化数据之前,我们需要了解序列化后会得到什么格式的序列(flatornested)。下面展示了这两种样式的顺序:flat(平面)样式,序列化后的数据会在物理行中:{"Type":"A","field1":"value1","field2":"value2","field3":"value3"}嵌套(nested)样式,序列化后的数据会分散在多个物理行中:{"A":{"field1":"value1","field2":"value2","field3":"value3"}}有关这两种样式的更多信息,请参阅以下讨论:Python邮件列表、IETF邮件列表、stackexchange。序列化格式"Structureddata"序列化后会得到两种序列化格式(serializationformat):text序列化格式,如JSONBinary序列化格式,如pickleText序列化格式Simplefile(flatdata)repr()repr()函数将单个对象作为参数并生成可由解释器读取的字符串表示形式。我们可以使用repr()将对象转换为可存储的平面样式字符串Flatstyle:a={"Type":"A","field1":"value1","field2":"value2","field3":"value3",}print(repr(a))#可以打印序列化后的内容#>{'Type':'A','field1':'value1','field2':'value2','field3':'value3'}withopen('./file.txt','w')asf:f.write(repr(a))#可以将序列化后的内容写入文件ast.literal_eval()literal_eval()方法安全解析和评估Python数据类型的表达式,支持的数据类型有:字符串、数字、元组、列表、字典、布尔和无。我们可以使用literal_eval()反序列化一个简单文件的内容来获得一个Python对象:importastwithopen('./file.txt','r')asf:inp=ast.literal_eval(f.read())print(f'{type(inp)}:{inp}')#>:{'Type':'A','field1':'value1','field2':'value2','field3':'value3'}CSV文件(平面数据)Python中的CSV模块实现了以CSV形式读写表格数据的类。读取的简单示例:#从文件中读取CSV数据importcsvwithopen('/tmp/file.csv',newline='')asf:reader=csv.reader(f)forrowinreader:print(row)写一个简单的例子:#将CSV数据写入文件importcsvwithopen('/temp/file.csv','w',newline='')asf:writer=csv.writer(f)writer.writerows(iterable)这个模块的内容、功能和例子可以在Python文档中找到。YAML(嵌套数据)Python中有很多第三方库用于解析和读写YAML文件,示例如下:#使用load方法从文件中读取YAML内容importyamlwithopen('/tmp/file.yaml','r',newline='')asf:try:print(yaml.load(f))exceptyaml.YAMLErrorasymlexcp:print(ymlexcp)第三方库的文档可以在PyYAML文档中找到.JSON文件(嵌套数据)Python的JSON模块可以用来读写JSON模块。示例如下:read:#从文件中读取JSON内容importjsonwithopen('/tmp/file.json','r')asf:data=json.load(f)write:#使用dump方法将JSON内容写入文件importjsonwithopen('/tmp/file.json','w')asf:json.dump(data,f,sort_keys=True)XML(嵌套数据)XML在Python中解析即可使用的xml库。示例:#从文件中读取XML内容importxml.etree.ElementTreeasETtree=ET.parse('country_data.xml')root=tree.getroot()可以找到使用xml.dom和xml.sax包的更多文档在PythonXML库文档中。二进制序列化格式NumPyArray(flatdata)Python的NumPy数组可以将数据序列化为字节形式的数据,也可以反序列化。示例:importNumPyasnp#将NumPy数组转换为字节形式byte_output=np.array([[1,2,3],[4,5,6],[7,8,9]]).tobytes()#将字节形式转换回NumPy数组array_format=np.frombuffer(byte_output)Pickle(平面数据)Python的原生数据序列化模块称为Pickle。示例:importpickle#示例字典grades={'Alice':89,'Bob':72,'Charles':87}#使用转储将对象转换为序列化字符串serial_grades=pickle.dumps(grades)#使用负载反序列化到objectreceived_grades=pickle.loads(serial_grades)Protobuf如果您正在寻找支持多种语言的序列化模块,那么Google的Protobuf库是一个选择。欢迎关注公众号:importhello