1Python文件IO操作的常用操作如下:clumncolumnopenopenreadreadwritewritecloseclosereadlinelinereadreadlinesmulti-linereadseekfilepointeroperationtellpointerposition1.1openopen(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)示例f=open('test')print(f.read())f.close()文件操作,最常用的是读写。文件访问有两种模式:文本模式和二进制模式。在不同的模式下,操作的功能不尽相同,表现的结果也不同。open函数的参数fileopens或要创建的文件名。如果未指定路径,则默认为当前路径。FileNotFoundError异常w只写打开,读则抛出异常;如果文件不存在,则直接创建文件;如果文件存在,则清除文件内容x如果文件不存在,则创建文件,并以只写方式打开;文件存在,抛出FileExistsError异常文件存在,只写打开,追加内容;如果文件不存在,创建后,只写打开,追加内容r只读,wxa为只写wxa可以生成文件,w不管文件存在与否,都会生成一个有新内容的文件;a可以追加到打开文件的末尾,不管文件是否存在;x必须事先要求该文件不存在,自己创建一个文件。文本模式t字符流,按照一定的字符编码理解文件的字节,按照字符进行操作。默认模式。二进制模式b字节流,文件被理解为字节,与字符编码无关。在二进制模式下操作时,字节操作使用字节类型。文件指针mode=r指针从0开始mode=a指针从EOF(文件末尾)开始seek(offset[,whence])移动指针。offset偏移了多少字节。在文本模式下:默认值为0,表示从头开始,只接受正整数。whence1表示从当前位置开始,只接受0whence2表示从EOF位置开始,只接受0字节模式:whence0默认值,表示从头开始offset只接受正整数whence1表示从当前位置开始,offset可正可负whence2表示从EOF位置开始,offset可正可负1.2常用函数功能说明read(size=-1)默认读取全部,text模式下,它是要读取的字符数。在字节模式下,它是字节数。readline(size=-1)一次读取多少行内容。默认情况下,所有readlines读取多行内容。write(s)将字符串s写入文件,并返回字符数close()flush并关闭文件对象。关闭后,再次关闭没有效果。已经关闭2上下文管理先看一个例子lst=[]for_inrange(2000):lst.append(open("test"))#OSError:[Errno24]Toomanyopenfiles:'test'print(len(lst))ulimit-a查看所有限制,其中openfiles为限制打开文件数,默认为1024。(base)zhaow@zhaow-610:~$ulimit-acorefilesize(blocks,-c)0datasegsize(kbytes,-d)unlimitedschedulingpriority(-e)0filesize(blocks,-f)unlimitedpendingsignals(-i)62945max锁定内存(kbytes,-l)65536max内存大小(kbytes,-m)unlimitedopenfiles(-n)1024pipesize(512bytes,-p)8POSIXmessagequeues(bytes,-q)819200real-timepriority(-r)0stacksize(kbytes,-s)8192cputime(seconds,-t)unlimitedmaxuserprocesses(-u)62945virtualmemory(kbytes,-v)unlimitedfilelocks(-x)unlimited解决方法:1.异常处理当出现异常发生有时会拦截到异常,但是OSError异常在很多代码中都可能出现,不容易判断是资源受限导致的异常。f=open('test')try:f.write('abc')finally:f.close()使用finally来保证所有的文件都可以关闭。上下文管理是一种特殊的语法,交给解释器来释放文件。withopen('test')asf:f.read()使用with...as关键字:上下文管理语句不开新作用域with语句块执行时,会自动关闭对应的文件对象类似一般来说,文件对象的IO对象在使用后需要关闭并注销,以释放资源。当打开IO时,会得到文件描述符fd,但是计算机资源是有限的,所以操作系统会做限制,保护计算机资源不会被完全耗尽。通常,除非您确切知道资源情况,否则不要提高资源限制来解决问题。3、StingIO和BytesIOStingIOio模块中的类:fromioimportStringIO,在内存中创建一个文本模式的缓冲区,可以像文件对象一样操作。当调用close方法时,缓冲区将被释放。getvalue()获取所有内容,与文件指针无关ExamplefromioimportStingIOsio=StringIO()#类似文件操作sio.write("testcontext")sio.seek(0)print(sio.getvalue())print(sio.readline())sio.close()BytesIOio模块类:fromioimportBytesIOmemory,以二进制方式开辟一个buffer,可以像文件对象一样操作当调用close方法时,buffer会释放getvalue()获取全部内容,与文件指针无关,类似于StringIO。一般来说,磁盘操作比内存操作慢很多。当内存足够的时候,一般的优化就是减少登陆,减少磁盘IO,这样可以大大提高程序的运行效率。4、3.4版本之前路径操作:os.path模块示例1fromosimportpathp=path.join('/etc'.'sysconfig','network')print(type(p),p)print(path.exists(p))print(path.split(p))print(path.abspath('.'))p=path.join('o:/',p,'text.txt')print(path.dirname(p))print(path.basename(p))print(path.splitdrive(p))#window下使用3.4版本后:pathlib模块示例1frompathlibimportPathp=Path()p.absolute()#绝对路径p=p.joinpath('a','b')p.absolute()p=p/'c'#拼接相当于p/='c',p=p.joinpath('c')#directory初始化p=Path()#当前目录p=Path('a','b','c/d')#当前目录中的a/b/c/dp=Path('/etc')
