![Python 3程序设计基础](https://wfqqreader-1252317822.image.myqcloud.com/cover/971/33892971/b_33892971.jpg)
4.3 文件操作
在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘。所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
4.3.1 打开关闭文件
open()将会返回一个file对象,基本语法格式如下:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/55_01.jpg?sign=1739115013-8Ci67d4XvuIppkIkkcSFUcBI1aj50zjo-0-27d2645e0cac2f71759e226fc8873415)
参数如下所示。
● filename:filename变量是一个包含了你要访问的文件名称的字符串值。
● mode:mode决定了打开文件的方式,如表4-2所示。
表4-2 Python打开文件方式
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/55_02.jpg?sign=1739115013-SU5VTT7cO5YqSK91ahH6CjvDybspTHpt-0-f33e773f744ab816df584f5148250cca)
(续)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_01.jpg?sign=1739115013-VX1HdicZmG6qDrVm1xjaCJnY8FJgzt7X-0-c0bc371c8f743b3d0ed29f63e05845ff)
【例4-3】 文件打开关闭举例。
在D:\下创建test.txt文本文件,如图4-2所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_02.jpg?sign=1739115013-Sgg6ABpm8RHOEmhNkNYs1DdShAjusztU-0-996e9120f3b80d5c20504c148259ba0c)
图4-2 test.txt文件
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_03.jpg?sign=1739115013-6k2kuaztKfc2XJJxvFC6Tad9RF5t74YY-0-a0d091e148cc75d182f816b2ed0c2ed8)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_04.jpg?sign=1739115013-H5boS2lHwVhwzFINmaLryxLUWYUuRgyi-0-72ccb5060f297ac4cf724749612b6b6d)
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=1739115013-jckSdPdnjgZa1a4FL7VuPMlXCmC3MvVt-0-4932d80e659deead1a8da93675df6e9c)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_02.jpg?sign=1739115013-utKsmGduHEoExaS5A1l4Elp4z6C7IKTJ-0-ed7b719efa67ff84361aa545ee7cbf9f)
方法二:readline()方法
readline()用于一行行地读出并显示文件内容。如果读到文件末尾,就返回一个空字符串。Readline()函数读取文件的流程如图4-3所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_03.jpg?sign=1739115013-HPVI2mI2pmGlBmgk4jXvHS5U33hxcu87-0-93d2d17abbc2cc4dde9def004f2e356c)
图4-3 readline读取文件
【例4-5】 readline()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_04.jpg?sign=1739115013-0d6a2fRDugxxVQVl7HUJs99MvAmIw4KK-0-608a73589967eec3b299c4aac10f5dec)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_05.jpg?sign=1739115013-B2Pak8LeH5i5OOhczFCkuNZHXxO1Klc9-0-0dc8035567e0a61d583b84d1b0732aa1)
方法三:readlines()方法
readlines()方法自动将文件内容存储为列表。
【例4-6】 readlines()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_06.jpg?sign=1739115013-P8U72guIXwGMKItjXcdeZLKGoptuGblL-0-1d50a5d23e2eb1dc63d5e4565933c50c)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/58_01.jpg?sign=1739115013-DNVsqpkTNLoCb7YYYGQT46d3D6UWIgly-0-d6eac2125a7d87b0f8e40eb6c08e888b)
总之,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=1739115013-tgZy4ZZc7ittubCLgkZydsSeETbbXrLN-0-f535d3efa9d56d1e2187edc620f276ea)
方法二:writelines()方法
writelines()的参数是序列,比如将列表写入文件。
【例4-8】 writelines方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/58_03.jpg?sign=1739115013-XzyZ1x5kcrcHwcki8K76fzYzqJ8V8Bdl-0-de7847accfef35a76e2e15bb3279955a)
总之,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=1739115013-jnlsNRO4r6W6EuTv3ptCODMekvJ9C3R3-0-d250df5b1bbff47b1e954e456558f005)
功能:用于判断文件是否可读,不可读则报错"No such file or directory:"。
【例4-9】 readable()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_02.jpg?sign=1739115013-5EEwFzRu0mHVSON4y76B616lYFzkkfH2-0-47cc3f08b08bfb5231b5b00ee5d03f51)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_03.jpg?sign=1739115013-QAPpJgnhXyBrLpmXRFDk1PEtSiGPWEHv-0-826a837a47a4b1342ca74e85af746516)
(2)seek()方法
seek()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_04.jpg?sign=1739115013-vtgo2EYkgy57DqOUTP5ZDFDaEvCU3rKS-0-4ec18b35069710ff93a85f94e2183c6a)
功能:把文件指针移动到相对于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=1739115013-IEdjnzn2c5xtjuJ1FeLbqNMNZmOfH1PU-0-eadc352212f4d43e61032e5d421f825d)
(3)next()方法
next()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_06.jpg?sign=1739115013-xOHt50c3DMXHrQHmUqSaivSausHeArbZ-0-4040b10ef3de2427b533de0f41edf258)
功能:用于文件的下一行。
【例4-11】 next()方法举例。
文件test.txt的内容如下:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_07.jpg?sign=1739115013-whlk7Z13lFaZZqiC2gqTDHNgIeU1RfF1-0-66684b5d5a52c1311cf094be3a5f9f30)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_01.jpg?sign=1739115013-B8SGWEDAmsa3gQKlEH00pFTuyZUDFN9I-0-ed9e516f90d75c95bea8335ab611f5e5)
代码如下:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_02.jpg?sign=1739115013-hCt3jeO2sEOsyDbyyWZXJw1BTD4oDcZ8-0-618abd1834b30b4538963f5a99e06d0f)
输出结果为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_03.jpg?sign=1739115013-VB6RWTC5dfHHXSKovAuaz6C9QRaFRcDv-0-af9f16b47b53b389188adb6649119060)
(4)tell()方法
tell()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_04.jpg?sign=1739115013-WPbqWxWkXAohA6YlUea2kIErpfTGHjp6-0-03aff73df92c73c5cead788f4aad5ba5)
功能:用于获取文件的当前指针位置,即相对于文件开始位置的字节数。
【例4-12】 tell()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_05.jpg?sign=1739115013-8c2jgPtuNpy5Myiniqq8Y9wLPJjEptHm-0-51f6aba3dae1e554758897441ee6a5cf)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_06.jpg?sign=1739115013-NovG8aUEzuQyrfwsshMQ41HMAVmJzLqh-0-429754f1450321f0ea73422479b3a66b)
(5)truncate()方法
truncate()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_07.jpg?sign=1739115013-WK0H7iWPJTJH08zzP8S0HbkHvGJjyN1o-0-6fc70fb67a7c2ef0716805658da99668)
功能:用于截断文件数据,仅保留指定之前指定字节数的数据。
【例4-13】 truncate()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/61_01.jpg?sign=1739115013-gUIPCDMkr67xW4bBQhCyVVwqEqsclKF9-0-24ab9b209f1526209f3e4ad2d956f24f)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/61_02.jpg?sign=1739115013-3a2M9KnzIU2UAHvCWFQaqZHNPYLHUJO5-0-1e89cf0573558525eef13f44aef4c366)