文件操作
IO操作指的一般是文件IO,如果指网络IO,会直接说网络IO
cp936 = codepage936就是 GBK,微软的编码方式,
我国信息化时间较晚,最早的中文编码是big5 码,然后统一的使用GB2312,现在通用的是GBK码
,使用两位的字节编码,编码范围0-65535,保留了ASCII码的0-127,汉字使用两个字节,通过查编码表,确定一串字节的含义。
看编码方式,才能知道磁盘上的0和1的含义
Unicode编码体系,Unicode和国际标准组织规定的全球范围的编码方式。使用两个字节编码,这对于拉丁字母的单字节使用国家来说,会对存储空间造成浪费,所以产生了Unicode的传输标准utf8.
utf-8 (8-bit Unicode Transformation Format) 多字节,从一个到六个字节,中文大部分3个字节
文件IO常用操作
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
文件系统是操作系统的子系统,文件查找不到报回的错误,是系统返回的OSError,操作系统文件系统报错
open 通过路径系统,使用系统调用,操作系统提供的功能,调用API接口,返回一个文件对象
文件地址找到文件,理解为流对象,通过编码方式读取文件。
open的默认模式是rt文本模式只读打开,不存在抛OsError
文件用完一定要关闭,流对象关闭不可在操作,f.close()
访问模式:文本模式,二进制模式
open 参数,
file 文件名,如果不指定路径,默认当前路径。绝对路径,相对路径。
操作会涉及指针操作,文件指针指向当前字节位置
mode r,w,a,x,b, t,+
r,只读模式,不可以写操作,指针指向0
w,只写操作,覆盖执行,不可读,相当于新建文件,指针指向0,写入可以创建新文件f.write,缓冲可能会不能直接看,关闭后执行flush操作后,才能catch查看,如果seek,也会执行一次flush。
x,不覆盖写,存在同名文件抛异常,不存在新建,create
a,追加尾部,不存在创建新文件。可以来写日志,
t,字符流,字符,返回字符流,按照某种编码理解,默认None,会自己判断,但还是要自己确定好编码。
b,字节流,字节模式,返回字节流,与编码无关,字节流用bytes操作
+,追加功能,追加没有的功能,+为rwax提供缺失的读或写的功能,
r+ 读从头开始,一写就会从头覆盖
w+ 写直接覆盖,直接清空,可读,但数据如果是字符,可能在缓冲区,read不出来
t,b,+ 不能独立使用。
文件类型的扩展名,默认会关联一些操作,系统通过文件的扩展名来查看文件,读取后在查看文件头的信息,确定能否执行,比如你用文本阅读器,打开mp3格式,无法打开,修改扩展名,也会显示一连串乱码。
出现乱码时,最好在创建文件时约定编码,windows下默认使用cp936,要使用utf-8,转换至linux下也是utf-8,才不会出现乱码。
buffering 缓冲区
是一个内存空间,大部分是先进先出队列,例外是环状。到缓冲区满了,或者到达阈值,数据才flush到磁盘
-1缺省,二进制和文本都表示使用默认,缺省缓冲区大小 默认为8192或4096个字节
0只在二进制使用,表示不用buffer,可以看作FIFO的文件,直接写入磁盘
1只给文本模式使用,行缓冲模式,文本模式下只用默认的缓冲区,见到换行符就换行,换行后同一行内有内容,一起写入磁盘。
大于1表示指定buffer的大小,文本模式没有影响。
seek会flush一次,close会调用flush一次,批处理是电脑使用的较好的方式
只要记住:
文本模式,一般都用默认缓冲区
二进制模式,是一个一个字节操作,可以指定buffer的大小
一般来说,默认缓冲区大小是个比较好的选择,除非明确知道,否则不调整塔。参数不懂不要乱动
一般编程中,明确知道需要写磁盘,可以手动调用一次flush,但是少用,与电脑习惯不同,可能会降低性能
encoding 编码,仅文本模式下使用
None表示缺省,依赖操作系统,windows下GBK。Linux下UTF-8,如果不写可能会乱码
跨平台时,一定要写上编码方式,最好的处理是都写上
error ignore表示忽略,None和strict表示错误时抛出ValueError
newline 新行,文本模式下,换行的转换
newline = None,根据操作系统换行,( , , = linux,ios,windows),文件中的'空串 , , '都会转换为当前系统的换行符,Linux下是
newline = '' 表示不做转换,
其他表示使用指定换行符分行。 或‘’ 表示 不替换,其他合法字符表示换行的会替换为指定字符
文件描述符,是有限资源,使用io下的表示文件打开后的文件id,默认的0,1,2使用给了,标准输入,标准输出,标准错误
closefd关闭文件描述符=True ,Flase关闭后保持,直到下次使用,fileobj.fileno()查看文件描述符
read(size)
读操作,指定size,不指定默认到EOF,结尾
read(size=-1),表示读取字节的个数,从指针开始读,-1是默认,读到结尾
readline一行一行读取
readlines(hint=-1) 立即返回一个列表,可以直接迭代文件,也是按行处理,只处理文本模式
write 写入
writelines,写入列表,可以自己提供换行符writelines(map(lambd ...,list)),或者默认跟随操作系统
f.close() flash并关闭文件
f.closed()判断是否打开,seekable readable,writeable,判断是否可索引,可读,可写
tell() 显示指针当前位置,mode = r时,指针在0,moda=a时,指针在EOF
seek(offset,[whence])
文本模式下,offset字节位置移动距离,只能是正整数,whence位置(0,1,2= 头,当前,尾),缺省值为0,设置为1时,offset只能为0,whence为2时,移动指针到尾部,offset为0
二进制模式下,whence 0缺省,offset只能为正,whence为1表示从当前位置开始,offset可正可负,whence为2表示从EOF位置开始,offset可正可负,不可超左界限,可超右界限。字节偏移,二进制支持任意起点的偏移。
b0a1 gbk第一位,汉字’啊‘
上下文管理
lsof 查看所有打开文件 ls open file,没有使用 yum install lsof 命令安装
文件的打开限制可以用ulimit -a 查看,文件描述符数目上限1024
可以做实验打开1024个文件,放在一个容器中,但最后一定要关,使用容器记录中间变量。
lsof -p 1427 | grep test |wc -l
使用容器存放文件打开目录 ,可以批量关闭
try
f = open('test') try: f.write("abc") finally: f.close() print("~~~~")
try...finally 结构可以保证关闭文件,但要保证前一句f = open("test")一定成立
with 强大的关闭文件的方法
f2 = open('test2') with f2: f2.write('ssss') print('wwwww')
with可以在函数返回return的语句执行后归还对象,甚至可以在执行程序退出前归还,with语句执行完会关闭对象。 sys.exit(-1)
with 上下文管理语句块不会启动新的作用域,与if的作用域类似,要有语句块,但不开启新的作用域
with...as
del f2 with open("test2") as f2: f2.write('ssss') print(f2.closed,'!!!!!')
可以理解为把打开的对象命名为f2
对于类似文件对象的IO对象,一般都要在不使用时关闭,注销,以释放资源
IO被打开时,会获得一个临时的文件描述符,计算机资源是有限的,所以操作系统都有限制。是为了保护计算机的资源不被用尽,计算机资源是共享的,不是独占的
一般情况下,除非特别明确知道资源情况,否则不要轻易提高资源限制值