初见Python<6>:文件读写
1、open函数语法:
python通过open函数打开文件,建立程序与文件之间的连接。
open函数语法:open(filename[,mode[,buffering]])
其中filename是指要进行操作的文件名称,由文件名称和路径组成,需要加引号。
mode为操作模式参数,包括读、写、追加等。
buffering是缓冲参数,控制着文件的缓冲。当buffering=0或者False时,I/O就是无缓冲的,所有的读写操作都是直接针对硬盘的,如果是1或者True,I/O就是有缓冲的,python是用内存来代替硬盘,使得程序运行更快。大于1代表缓冲区的大小,单位为字节,-1或者其他任意负数代表使用默认的缓冲区大小。
只有filename参数是必须指定的,mode和buffering参数则是可选的,mode参数的缺省值为'r'。
2、参数mode的取值:
(1)基本取值:
r、w、a为打开文件的基本模式,分别表示只读、只写(覆盖写)、追加(追加写)。
b、t、+、U,与上面三个基本模式组合使用。
注意:文本模式用于打开文本文件,二进制模式用户打开二进制文件。
(2)常见的mode组合取值:
(3)举例说明:
现在window系统PC机硬盘上存在文件G:\file1.txt,对其进行演示操作。
①r模式:
报错的原因是路径中包含的'\'被识别为转义符,因此造成文件路径错误。
不能直接使用print打印对象f1的内容,需要使用read方法读取内容后,方能打印。
上面的open函数中虽然没有指定mode参数,但其实使用了mode的缺省值'r'。
效果一样,所以当只使用'r'参数时,可以省略。
另外,这里如果不想使用两个反斜杠,那么可以使用‘r+字符串’形式:
字符串前加r代表此字符串为原样显示,不转义。第一个'r'就是让字符串原样显示,第二个'r'是open模式。
②w模式:
由于只使用了'w',因此程序对该文件只有写权限,没有读权限,因此使用read方法读时会报错。
完成这一步操作后,通过资源管理器去查看file1.txt的文件内容,如下,发现里面已被清空。
这是因为还没有断开程序与文件的连接,所以追加的内容尚未保存,因此需要使用close方法来关闭文件(即断开文件与程序的连接)。重新打开文件可以看到,文件已被新内容覆盖更新。
③a模式:
报错的原因是'a'模式只有写的权限,没有读的权限。
完成write操作后,但在关闭文件前,可以看到file1.txt文件并没有被更新。
关闭文件后,可以看到新内容被追加到文件末尾。
如果想换行追加,可以加上在字符串中加上换行符。
④r+模式:
'r+'模式是同时读写模式,但是必须指定写的位置,从指定的位置开始按字符逐个覆盖写。
从上面的两次写操作过程可以看出,第一次通过seek(0)指定从第一个字符开始覆盖写,第二次通过seek(5)从第6个字符开始覆盖写,没有被覆盖的字符继续保留。
如果不指定其实位置就开始进行写操作的话,就会报错,如下。
对于seek()方法的具体作用,在后面将会谈到。
⑤w+模式:
对于'w+'模式,其只是在'w'模式上添加了能读取文件对象的权限。
另外,从上面的例子中需要注意一点,一旦通过'w+'模式将一个文件指定给一个文件对象,那么这个文件就立即被清空,所以这里的f10.read()的结果是空串。也就是说,使用'w'或者'w+'模式,原文件的内容并不是在使用write方法时被覆盖掉,而是在授予写权限时就立即被清空。
⑥a+模式:
'a+'模式相对于'a'是增加了读文件的权限,但是从上例中可以看出,使用了read方法后,再进行write写操作就会报错,而不使用read方法直接进行write写操作是不会报错的,并且追加写成功。
3、常用的文件方法:
(1)基本介绍:
(2)举例说明:
现有文件:G:\file2.txt,文件内容如下:
read()方法是读取全部文件内全部数据内容,以字符串形式显示,对于文件中的换行符,在结果中以'\n'显式显示。读读取前,指针位于文件头(位置为0),读取全部后,指针位于文件末尾的下一位。返回文件位置用tell()方法,结果为长整型。
read(size)方式是指定读取字符串的字节数。最初指针放在文件开头,读取完毕后,移动至已读取字符串的下一位。
所以这里,使用read(5)读取了前5个字符,指针移动到第6个字符处,也就是编号为5L的位置。接着再使用read(7)读取的时候就从第6个字符开始读,以此类推。
使用readline()方法,逐行读取,每次读取一行,读取完毕后指针移到下一行开头。
readlines()方式是将读取的结果以列表形式存储,读取完毕后,指针移到文件末尾的下一位。原文件中的每一行是返回列表中的一个元素。
使用'a'模式进行追加写,打开文件后,指针仍指在文件头,通过write()方法写进字符串后,指针移到文件尾的下一位。
这个例子与上个例子的区别用于说明,当我们想在文件中追加写多行时,需要在追加的字符串中显式的写出换行符(\n)。
现有文件file3.txt,文件内容如下:
使用readlines()方法将读取文件的内容保存成列表。然后使用writelines()方法将该列表追加到另一个文件的末尾。每一个元素称为一行,由于起始位置为原文件的末尾下一位(并不是下一行),所以追加的第一行并没有单独成行,而是在原文件的最后一行的后面。
上例可以说明,writelines()方法接受列表,将列表每个元素作为一行写入文件中。
注意,因为有write()方法,所以python中是不存在writeline()方法的。
---------------------------------------------------
作者:hbsygfz
邮箱:hbsygfz@163.com
如有不当之处,请多指正。文章系笔者原创,转载请注明出处。谢谢!
作者:hbsygfz
邮箱:hbsygfz@163.com
如有不当之处,请多指正。文章系笔者原创,转载请注明出处。谢谢!