- Python 3程序设计基础
- 周元哲编著
- 1569字
- 2021-04-03 18:37:07
4.3 文件操作
在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘。所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
4.3.1 打开关闭文件
open()将会返回一个file对象,基本语法格式如下:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/55_01.jpg?sign=1739038961-rEPAvT2C6kURCL1dXpLazvnYKWwPLjQB-0-158de1bbb766b0a86739f103f85a14e0)
参数如下所示。
● filename:filename变量是一个包含了你要访问的文件名称的字符串值。
● mode:mode决定了打开文件的方式,如表4-2所示。
表4-2 Python打开文件方式
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/55_02.jpg?sign=1739038961-BPUyS5tzBfEMwoBtzWNCfk3nCVNC91vs-0-5e355cb53513d83e42746a0c2f1b5227)
(续)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_01.jpg?sign=1739038961-a5hCf5Y34U6DlgVNaeHxRPMBVQtvJ3YN-0-4b7014de0217c88793aa9c4b261fd6b7)
【例4-3】 文件打开关闭举例。
在D:\下创建test.txt文本文件,如图4-2所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_02.jpg?sign=1739038961-kwSKxGqe8jtxDR9WssgQzXan8cJzFoft-0-8391d718d551ee8702f23c7b16d14358)
图4-2 test.txt文件
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_03.jpg?sign=1739038961-lUbM8T2YRxRP50TORJG3ad5oBGSFSUuS-0-a9c6a2ec26e7862e3bef912af786d2dc)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_04.jpg?sign=1739038961-pAqTAyoIHAk1MwbfDQE6fZMhvzGxfkEl-0-f53611c797b7ad6e06fbb3c74c840f5f)
4.3.2 读写文件
1.读文件
读文件需要三个步骤。
步骤1:以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符。标示符'r'表示读。如果文件不存在,open()函数就会抛出一个IOError的错误。
步骤2:如果文件打开成功,调用read()等方法读取文件内容,Python把内容读到内存,用一个ret对象表示。
步骤3:调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源。
读文件具有如下三种方法。
方法一:read()方法
read()方法用于一次性将文件里的内容全部读取,也可以指定每次读多少个字节,如read(8)就是从文件开始读取5个字节。
【例4-4】 read()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_01.jpg?sign=1739038961-TJFkS8g5voSKmTOMocF3JG2UzxEraVT3-0-5eb2ee5e674b83adad35c41f5e258936)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_02.jpg?sign=1739038961-9nLxicFOSC9shjvbJ3Q5LvB1BJPD8wFv-0-85edb5c31cd9e89b6dae8fcf0b19db8a)
方法二:readline()方法
readline()用于一行行地读出并显示文件内容。如果读到文件末尾,就返回一个空字符串。Readline()函数读取文件的流程如图4-3所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_03.jpg?sign=1739038961-5IR0f0JmkzKFtHqoRKQd1TyWmQaNXsZr-0-57dc61ed22501ec6ff6ec7f2c74d185a)
图4-3 readline读取文件
【例4-5】 readline()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_04.jpg?sign=1739038961-cULnZP1XWuO7LwYzMyBV15zEzYhUNxfo-0-6aaac1d9cfc5ba604283dded3aeac198)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_05.jpg?sign=1739038961-ghK7DxgFlHFhCwXKuOWPBJNe1f6GXknw-0-d7dc7ef981f51520e7326c7c6b02902c)
方法三:readlines()方法
readlines()方法自动将文件内容存储为列表。
【例4-6】 readlines()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_06.jpg?sign=1739038961-P6ZCDh9eZm5zr3Qb0iJM5uD9ypHpzE47-0-a27d04dbf88ba13902d8abed3a7b34ae)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/58_01.jpg?sign=1739038961-mnwAcc3OwEYU2bmiX9bd7XLsoJ1coYfc-0-1c4c04e39f0d7097e61c7581401fa15d)
总之,Python文件对象提供了三个“读”方法:read()、readline()和readlines()。每种方法可以接受一个变量以限制每次读取的数据量。
● read()每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。如果文件大于可用内存,可以反复调用read(size)方法,每次最多读取size个字节的内容。
● readline()与readlines()之间的差异是后者一次读取整个文件,像read()一样。readlines()自动将文件内容分析成一个行的列表,该列表可以由Python的for... in...结构进行处理。
● readline()每次只读取一行,通常比readlines()慢得多。仅当没有足够内存可以一次读取整个文件时,应该使用readline()。
2.写文件
写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符为'w'。写文件具有如下两种方法。
方法一:write()方法
写入文件write()参数是字符串。
【例4-7】 write方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/58_02.jpg?sign=1739038961-MmVdSLwc4UaA0HGhp0y9ZLfsEMW4dfEp-0-bc646f9a30888f5d416fe0d70a0d0aa4)
方法二:writelines()方法
writelines()的参数是序列,比如将列表写入文件。
【例4-8】 writelines方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/58_03.jpg?sign=1739038961-glkxPFSIJ7qla5s5pGv6B7kxUgDLbo3A-0-f571d80298e761dc741d6e661f9e19eb)
总之,Python文件对象提供了两个“写”方法:write()和writelines()。
● write()方法和read()、readline()方法对应,是将字符串写入到文件中。
● writelines()方法和readlines()方法对应,也是针对列表的操作。它接收一个字符串列表作为参数,将它们写入到文件中,换行符不会自动加入,因此需要显式地加入换行符。
4.3.3 文件相关方法
下面介绍文件的相关方法,如readable()方法、seek()方法、next()方法、tell()方法和truncate()方法。
(1)readable()方法
readable()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_01.jpg?sign=1739038961-XDcBvfXJqh0MYS0PahEdX3J27qLXqqB5-0-7656fb9b15e0f89a2193d9787655f78f)
功能:用于判断文件是否可读,不可读则报错"No such file or directory:"。
【例4-9】 readable()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_02.jpg?sign=1739038961-ufRp49hMg0rw2wpSuCTDla6wgtCIpgaM-0-6266360cae89d572fc69d572ab7243ae)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_03.jpg?sign=1739038961-paHBttbC3WKoTb0mgNs2P64bv8E1yTJo-0-fa5d687d9452848754829cfb031c5903)
(2)seek()方法
seek()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_04.jpg?sign=1739038961-eQQTPblu8RsgGXBNIRMBZIfmD363NZPh-0-516228b8976f5b9fd2ba64cc88e476c9)
功能:把文件指针移动到相对于whence的offset位置。其中,offset表示要移动的字节数,移动时以offset为基准,offset为正数表示向文件末尾方向移动,为负数表示向文件开头方向移动;whence指定移动的基准位置,为0表示以文件开始处作为基准点,为1表示以当前位置为基准点,为2表示以文件末尾作为基准点。
【例4-10】 seek()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_05.jpg?sign=1739038961-T7CpUTiUVzim1Spsfc0YuNhGF1SDr2Xk-0-7d35694bac8e3478f8b4b8ac8c7f7c02)
(3)next()方法
next()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_06.jpg?sign=1739038961-PlUxztZWcHaxuT9HUdYIHt2swF5zbK4O-0-17a5dc10dd1febce04695ee04abc039d)
功能:用于文件的下一行。
【例4-11】 next()方法举例。
文件test.txt的内容如下:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_07.jpg?sign=1739038961-3c3kDxfjk3Ci6w3hrYFJUHgVrgRWLO7a-0-31de81d108e8c3d5932bada9890c3f53)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_01.jpg?sign=1739038961-xUCNF457WE5VDQmbm8UGhZgOXvOYJmH0-0-c15099301109ff41df2cfd7b029931fb)
代码如下:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_02.jpg?sign=1739038961-q3b7QqjrT8ZrCPrBo0CHbgmgZ7OTC1MN-0-1b4db169d8054908f82fbb086306f045)
输出结果为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_03.jpg?sign=1739038961-eDsfjTtWW9aPUagQsrUW41mnHbHsr4N5-0-cbc8353e603c5aca930706b26faadc13)
(4)tell()方法
tell()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_04.jpg?sign=1739038961-XEj19uF5mwpQmqQj48Xlu7mjkrTMXdxA-0-e32f87b3e502cd05bc5e800f16e63dfe)
功能:用于获取文件的当前指针位置,即相对于文件开始位置的字节数。
【例4-12】 tell()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_05.jpg?sign=1739038961-T8zI6xM6j3d58BPynkTigfcHAWJKxUcu-0-2362bc1964f65dd48abe8903f14dbba3)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_06.jpg?sign=1739038961-jFMlOgV6Rt5zlBZFt5vE7TXSjdFLi0rb-0-0e4fae08dbd550025f2bc3828dc4f498)
(5)truncate()方法
truncate()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_07.jpg?sign=1739038961-Wj8zpctO9qhxDnnihXatFDAQz3dzPDBc-0-ede317adb793fdd8bd5bb85f424fb071)
功能:用于截断文件数据,仅保留指定之前指定字节数的数据。
【例4-13】 truncate()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/61_01.jpg?sign=1739038961-LrMhwbEvmklxCHzXQ71MdSFF7B4ofFJP-0-89a8bb0142b0a9fd494909966138ac27)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/61_02.jpg?sign=1739038961-h8S40PwAdGQRrI8HKg1rODetxICOmRR6-0-412eec0fe7501e2949b95a6e1df1c16d)