参考资料:
注:由于感觉自己的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'x80x04x95x81x01x00x00x00x00x00x00x8cx0ctorch._utilsx94x8cx12_rebuild_tensor_v2x94x93x94(x8c torch.storagex94x8cx10_load_from_bytesx94x93x94Cxfdx80x02x8a lxfcx9cFxf9 jxa8Px19.x80x02Mxe9x03.x80x02}qx00(Xx10x00x00x00protocol_versionqx01Mxe9x03X x00x00x00little_endianqx02x88X x00x00x00type_sizesqx03}qx04(Xx05x00x00x00shortqx05Kx02Xx03x00x00x00intqx06Kx04Xx04x00x00x00longqx07Kx04uu.x80x02(Xx07x00x00x00storageqx00ctorch FloatStorage qx01X x00x00x002954476202240qx02Xx03x00x00x00cpuqx03Kx01Ntqx04Q.x80x02]qx00X x00x00x002954476202240qx01a.x01x00x00x00x00x00x00x00x9ax99x99?x94x85x94Rx94Kx00Kx01x85x94Kx01x85x94x89x8cx0bcollectionsx94x8cx0bOrderedDictx94x93x94)Rx94tx94Rx94.'
和json明显不同,pickle将文件保存为了二进制01串,只要你能dump成功,你就能在任何其他地方load回来,然后直接或间接使用这个对象。
注意了,不是所有的情况都能dump成功的。pickle是要依据序列化协议的!但大多数情况都是可以成功的,只要对象继承自object。
下面是在另一个文件中读取pickle的例子:
可见读取到了正确的torch.Tensor对象!我这里读取的方法其实麻烦了,标准的直接做法如下:(也是要注意区分load, loads, dump, dumps的区别)