文件读写

1.json是什么

-javascript Object Notation js对象表示法

-json和js对象格式一样,只不过json字符串中的属性名必须加双引号其他得和js语法一致

json分类:1.对象{},2.数组[]

json中允许的值:

1.字符串       2.数值        3.布尔值

4.null            5.对象         6.数组

2.python中关于json的方法

1.json.load():  这个方法是用来读取文件的,将文件打开然后就可以直接读取。

2.json.loads(): json.loads()用于将str类型的数据转成dict

3.json.dump():用于将dict类型的数据转成str,并写入到json文件中。

4json.dumps():  用于将dict类型的数据转成str,因为如果直接将dict类型的数据写入json文件中会发生报错,因此在将数据写入时需要用到该函数。

5.关于追加写入json文件的方法,首先用json.load()读取json文件,然后loads()转化为字典,用字典方法设置键值,然后用dumps()写入文件

3.打开文件读写时候的问题:

一般我用 with open的方法打开文件,打开时可以添加操作'r','a','w',也可以定义编码格式 encoding = ‘UTF-8’等等。

1.传入目录时报的IOError:

原因及解决办法 :在python和很多程序语言中"\"转义符号,要想输出\ 有两种方法,一是多加一个\写成\\ ,一是在字符串前加一个r,提示解释器按原始字符处理

2.Image.open()报错,提示 image file is truncated (XX bytes not processed)

可以用try...except,如果报错则不保存图片

还可以用PIL模块中的ImageFile方法解决

ImageFile.LOAD_TRUNCATED_IMAGES =True

3.UnicodeDecodeError: 'gbk' codec can't decode byte 0x82 in position 52: illegal multibyte sequence

解决方法:其实是编码错误,选择正确的编码格式即可

~python3中的中文默认占3个字节长度

~python的内存管理机制:

引用计数器机制:利用引用计数器方法,在检测到对象引用个数为0时,对普通的对象进行释放内存的机制

关于循环引用问题

(1)循环引用即对象之间进行相互引用,出现循环引用后,利用上述引用计数机制无法对循环引用中的对象进行释放空间,这就是循环引用问题

(2)循环引用形式:

class Person(object):

    pass

class Dog(object):

    pass

p = Person()

d = Dog()

p.pet = d

d.master = p

即对象p中的属性引用d,而对象d中属性同时来引用p,从而造成仅仅删除p和d对象,也无法释放其内存空间,因为他们依然在被引用。深入解释就是,循环引用后,p和d被引用个数为2,删除p和d对象后,两者被引用个数变为1,并不是0,而python只有在检查到一个对象的被引用个数为0时,才会自动释放其内存,所以这里无法释放p和d的内存空间

关于垃圾回收(底层层面--原理)

(1)垃圾回收的作用:从经过引用计数器机制后还没有被释放掉内存的对象中,找到循环引用对象,并释放掉其内存

(2)垃圾回收检测流程:

一.任何找到循环引用并释放内存:1.收集所有容器对象(循环引用只针对于容器对象,其他对象不会产生循环引用),使用双向链表(可以看作一个集合)对这些对象进行引用;2.针对每一个容器对象,使用变量gc_refs来记录当前对应的应用个数;3.对于每个容器对象,找到其正在引用的其他容器对象,并将这个被引用的容器对象引用计数减去1;4.经过步骤3后,检查所有容器对象的引用计数,若为0,则证明该容器对象是由于循环引用存活下来的,并对其进行销毁

二.如何提升查找循环引用过程的性能:由一可知,循环引用查找和销毁过程非常繁琐,要分别处理每一个容器对象,所以python考虑一种改善性能的做法,即分代回收。首先是一个假设--如果一个对象被检测了10次还没有被销毁,就减少对其的检测频率;基于这个假设,提出一套机制,即分代回收机制。

通过这个机制,循环引用处理过程就会得到很大的性能提升

而回收机制又有自动回收和手动回收,这里不再细说

综上所述,python的内存管理机制就是引用计数器机制和垃圾回收机制的混合机制

你可能感兴趣的:(文件读写)