Input and Output, Python Tutorial阅读笔记(4)

  参考资料:

  Python官网Tutorial

  注:由于感觉自己的Python还没有学通透,在看项目的代码时还是有一些困难。所以想看一下Python官网的Tutorial自学一下,我在读的时候也是略过了自己已经会的地方,所以我写的东西都是自己学到的新东西。

  规范:黑体x)表示自己学到的东西模块,是一个大概的区分。4.1,4.2等表示在Tutorial中的位置。

  1)7.1 Fancier Output Formatting

  这一节其实就是讲解了一种特殊的字符串表示方式,即在字符串前面加上一个f:f"XXX"

  之前我们说,在字符串前面加上r可以表示这是一个raw字符串,防止了转义字符的干扰。那么在字符串前面加上f的作用其实也是Python的一种特性,如下例:

>>> year = 2016
>>> event = 'Referendum'
>>> f'Results of the {year} {event}'
'Results of the 2016 Referendum'

  可见使用这种“Fancier Output Formatting”的要素有两个:

  1. 字符串前面一定要加上一个小写的f

  2. 字符串里面有中括号{},且括号内会有一个对象,也就是我们输出转换的对象

  

  2)另一种格式化字符串的方法,如下例:

>>> yes_votes = 42_572_654
>>> no_votes = 43_132_495
>>> percentage = yes_votes / (yes_votes + no_votes)
>>> '{:-9} YES votes  {:2.2%}'.format(yes_votes, percentage)
' 42572654 YES votes  49.67%'

  一看就会,值得注意的是这一次字符串里面的{}里,内容是不是丰富了许多?丰富了哪些内容?

  1. 多了一个冒号:冒号右边的表示 格式 冒号左边的表示 对象

  2. 既然右边的表示格式,那么格式有哪些?这个我写在文末

  3. 既然左边的表示对象,那么可以怎么表示?

  这里回答 3. 答案是,可以是 0 , 1, 2... 也可以是一个标志符,看了下例就懂了:

>>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred',
                                                       other='Georg'))
The story of Bill, Manfred, and Georg.

  

  3)7.2.2 Saving structured data with json

  下面讲一下如何将结构化的数据保存到文件系统中。这里使用的是json,它将一切的数据保存为文本文件json。这个过程叫做serializing。

  但是,json一般仅仅用来保存列表和字典。并且,你不要认为它保存的是文本,读取到内存中之后读到的对象都是str,对象的类型可以有不同种!比如int,float等。如下例:

>>>A = json.dumps([1.1, "simple", "list"])
>>>type(A)
<class 'str'>
>>>B = json.loads(A)
>>>type(B[0])
<class 'float'>

  保存到文件中仅需把dumps和loads换成dump和load,调用的时候加一个文件句柄参数。

  

  4)前面说到,json大多用来保存简单的list和dict对象,复杂的对象它是不能够保存的。(因为json保存的是文本,有些数据结构再复杂的文本也没法保存啊!)此时我们需要使用pickle这个包。理论上来说它能将内存中的一切对象保存到文件系统中。

  看下例:

>>> import torch
>>> import pickle
>>> A = torch.tensor([1.2])
>>> B = pickle.dumps(A)
>>> B
b'\x80\x04\x95\x81\x01\x00\x00\x00\x00\x00\x00\x8c\x0ctorch._utils\x94\x8c\x12_rebuild_tensor_v2\x94\x93\x94(\x8c\rtorch.storage\x94\x8c\x10_load_from_bytes\x94\x93\x94C\xfd\x80\x02\x8a\nl\xfc\x9cF\xf9 j\xa8P\x19.\x80\x02M\xe9\x03.\x80\x02}q\x00(X\x10\x00\x00\x00protocol_versionq\x01M\xe9\x03X\r\x00\x00\x00little_endianq\x02\x88X\n\x00\x00\x00type_sizesq\x03}q\x04(X\x05\x00\x00\x00shortq\x05K\x02X\x03\x00\x00\x00intq\x06K\x04X\x04\x00\x00\x00longq\x07K\x04uu.\x80\x02(X\x07\x00\x00\x00storageq\x00ctorch\nFloatStorage\nq\x01X\r\x00\x00\x002954476202240q\x02X\x03\x00\x00\x00cpuq\x03K\x01Ntq\x04Q.\x80\x02]q\x00X\r\x00\x00\x002954476202240q\x01a.\x01\x00\x00\x00\x00\x00\x00\x00\x9a\x99\x99?\x94\x85\x94R\x94K\x00K\x01\x85\x94K\x01\x85\x94\x89\x8c\x0bcollections\x94\x8c\x0bOrderedDict\x94\x93\x94)R\x94t\x94R\x94.'

  和json明显不同,pickle将文件保存为了二进制01串,只要你能dump成功,你就能在任何其他地方load回来,然后直接或间接使用这个对象。

  注意了,不是所有的情况都能dump成功的。pickle是要依据序列化协议的!但大多数情况都是可以成功的,只要对象继承自object。

  下面是在另一个文件中读取pickle的例子:

   可见读取到了正确的torch.Tensor对象!我这里读取的方法其实麻烦了,标准的直接做法如下:(也是要注意区分load, loads, dump, dumps的区别) 

posted @ 2020-12-29 14:42  思念殇千寻  阅读(115)  评论(0编辑  收藏  举报