Python编程基础与科学计算
上QQ阅读APP看书,第一时间看更新

4.2.1 文件的打开与关闭

1.打开文件

要从一个文件中读取数据,或者往文件中写数据,都需要提前打开文件。Python内置打开文件的函数open(),open()函数的格式如下:

     fp=open(fileName,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,
opener=None)

各参数的意义说明如下:

  • fp表示打开文件的对象,名字可以由读者自行确定,通过文件对象对文件进行读写等操作,例如fp.readlins()读取文件内容。
  • fileName表示要打开的文件名,可以是相对当前路径的文件,也可以是绝对路径的文件,例如"D:\\doc\\doe.txt"。文件打开后,可以用fp.name属性返回被打开的文件名。
  • mode表示打开模式,mode的取值是字符'r'、'w'、'x'、'a'、'b'、't'、'+'或其组合。'r'表示打开文件只读,不能写;'w'表示打开文件只写,并且清空文件;'x'表示独占打开文件,如果文件已经打开就会失败;'a'表示打开文件写,不清空文件,以在文件末尾追加的方式写入;'b'表示用二进制模式打开文件;'t'表示文本模式,默认情况下就是这种模式;'+'表示打开的文件既可以读取,也可以写入。mode常用的取值和意义参考表4-2的内容。文件打开后,利用fp.mode属性可以返回文件打开方式。
  • buffering表示设置缓冲区。如果buffing参数的值为0,表示在打开文件时不使用缓冲区,适合读取二进制数据;如果buffering的值取1,访问文件时会寄存行,适合文本数据;如果buffing参数值为大于1的整数,该整数用于指定缓冲区的大小(单位是字节),如果buffing 参数的值为负数,则代表使用默认的缓冲区大小。缓冲区的作用是:程序在执行输出操作时,会先将所有数据都输出到缓冲区中,然后继续执行其他操作,缓冲区中的数据会由外设自行读取处理;当程序执行输入操作时,会先等外设将数据读入缓冲区中,无须同外设做同步读写操作。如果参数buffering没有给出,则使用默认设置,对于二进制文件,采用固定块内存缓冲区方式,内存块的大小根据系统设备分配的磁盘块来决定,如果获取系统磁盘块的大小失败,就使用内部常量io.DEFAULT_BUFFER_SIZE定义的大小。一般的操作系统,块的大小是4096B或者8192B;对于交互的文本文件(采用isatty()判断为True),采用一行缓冲区的方式,文本文件其他方面的使用限制和二进制方式相同。
  • 参数encoding设定打开文件时所使用的编码格式,仅用于文本文件。不同平台的encoding参数值也不同,Windows默认为GBK编码。对于Windows的记事本建立的文本文件,编码格式有ANSI、UTF-8和UTF-16,记事本默认的存储格式是UTF-8,使用时选择另存为文件,同时选择编码格式即可。在读取记事本保存的文件时,将encoding设置成对应的编码格式即可。
  • 参数errors用来指明编码和解码错误时怎样处理,不能在二进制的模式下使用。当指明为'strict'时,编码出错则抛出异常ValueError;当指明为'ignore'时,忽略错误;当指明为'replace'时,使用某字符进行替换,比如使用'?'来替换错误。
  • 参数newline是在文本模式下用来控制一行的结束符。可以是None、''、\n、\r、\r\n等。读入数据时,如果新行符为None,那么就以通用换行符模式工作,意思就是说当遇到\n、\r或\r\n都可以将其作为换行标识,并且统一转换为\n作为文本换行符;当设置为空''时,也是通用换行符模式,不转换成\n,保持原样输入;当设置为其他相应字符时,就用相应的字符作为换行符,并保持原样输入。输出数据时,如果新行符设置成None,那么所有输出文本都采用\n作为换行符;如果新行符设置成''或者\n,不做任何的替换动作;如果新行符是其他字符,会在字符后面添加\n作为换行符。
  • 参数closefd用来设置给文件传递句柄后,在关闭文件时,是否将文件句柄进行关闭。
  • 参数opener用来设置自定义打开文件的方式,使用方式比较复杂。

表4-2 打开文件的模式

注意表4-2中,使用含有“r”的方式打开文件时,文件必须存在,否则会报错;含有“w”的方式打开文件时,如果文件存在则清空文件,如果文件不存在则创建新文件;含有“t”的方式打开文件时,是以文本形式读写;含有“b”的方式打开文件时,是以二进制形式读写;含有“a”的方式打开文件时,表示在文件末尾追加(append);含有“+”的方式打开文件时,表示既可以读也可以写。例如fp=open("d:\\peo.txt")表示以只读模式打开d盘下的peo.txt文件。fp=open("d:\\peo.txt",'w+')表示以读写方式打开d盘下的peo.txt文件,如果peo.txt文件存在,则清空peo.txt中的内容,可以往peo.txt中写入内容,写入后也可以读取文件中的内容;如果peo.txt文件不存在,则新建peo.txt文件。fp=open("d:\\ peo.txt",'a+')表示以读写方式打开d盘下的peo.txt文件,如果peo.txt文件存在,将指针放到peo.txt内容的末尾,用于追加内容,写入后也可以读取文件中的内容;如果peo.txt文件不存在,则新建peo.txt文件。

下面的程序以'wt'方式新建一个文件,在文件中逐行写入一些文字。

直接用open()函数打开文件,有可能打开文件失败,例如文件不存在、文件已经被别的程序打开等。为了防止出错,可以用with语句,其格式如下。

     with open()asfp:
语句块

下面的代码用with语句可以逐行输出文件中的内容。

2.关闭文件

文件打开后,读写完毕要及时关闭。关闭文件使用fp.close()方法,如果缓冲区中还有没读写完成的数据,close()方法会等待读写完数据后再关闭文件;用fp.closed属性可以判断文件是否已经关闭。