![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=1739532524-gtebSj9khM6bHyG404jBsXJ5yTtg5Eu8-0-f2722f46fb0b53c6b3b509d3a8fd1a2e)
参数如下所示。
● filename:filename变量是一个包含了你要访问的文件名称的字符串值。
● mode:mode决定了打开文件的方式,如表4-2所示。
表4-2 Python打开文件方式
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/55_02.jpg?sign=1739532524-wfrgudhG28cNesCe6VeE6L3knjklf3do-0-41267e0679061feda9c5189081412822)
(续)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_01.jpg?sign=1739532524-vbdDMdzgcgPyTxpldUCVNei88zrHROiI-0-3d9de52a98c8f25e8fded8378f89815a)
【例4-3】 文件打开关闭举例。
在D:\下创建test.txt文本文件,如图4-2所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_02.jpg?sign=1739532524-pw2143KFxJclU8D6MGgZKbUUjrxo2Dk6-0-5b7608772b6dea44a47e7ae99b48467a)
图4-2 test.txt文件
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_03.jpg?sign=1739532524-bVFd6MtPejgmGf4DYdvjmQd8QH4ehMct-0-348c9da5c52f11b840fb87343390943f)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_04.jpg?sign=1739532524-ffKUDq9d2BOJaHQ30VGBv24P7XtBpvY4-0-c911960b491b773721e7c9f3f697bcad)
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=1739532524-T8cVrzNrfZ4K6iPkTAhdF4EKZ6nhwiGM-0-7785d5956a928ea0b3051a98f3b87587)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_02.jpg?sign=1739532524-5uuFxLYks9PqKshoL0O23emdeD2vSzki-0-5ae3a80708e6c03a1f19eb664de01a45)
方法二:readline()方法
readline()用于一行行地读出并显示文件内容。如果读到文件末尾,就返回一个空字符串。Readline()函数读取文件的流程如图4-3所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_03.jpg?sign=1739532524-54WAmlm1ToLhB4if19mfBSIDOcxnWKxC-0-6b8b5ece2223d078864fbdc09a06f461)
图4-3 readline读取文件
【例4-5】 readline()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_04.jpg?sign=1739532524-Wl3Ql36F7TrDU7IOjWZ7OUwsyRgUbvaO-0-f15ef49cad2a309379453da6297f9f3d)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_05.jpg?sign=1739532524-QB0kd0aOgFQ6JRz7nxLJJZTHNrkWUecA-0-396d310bafb794c68c865e61527eeac8)
方法三:readlines()方法
readlines()方法自动将文件内容存储为列表。
【例4-6】 readlines()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_06.jpg?sign=1739532524-7JyvZ95uOLoCzOx4aMq6Agjjav9fo5vP-0-522418afd7511b17b59aa9675e6252a2)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/58_01.jpg?sign=1739532524-Mto6XxCpQGEiviQRaTJy0FV6hiCaAe92-0-2f0718d86bc3920863bd6b5b96cd2fc4)
总之,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=1739532524-CVSrfQP0gnDQR2BPuQKd5WVdnZWbKx6Y-0-0efa920c384cbe2c34f630cedc629cd1)
方法二:writelines()方法
writelines()的参数是序列,比如将列表写入文件。
【例4-8】 writelines方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/58_03.jpg?sign=1739532524-t8IqsZGY26dg9aexMwSq9b0kt1JgGx7W-0-65973e9393bbddeae395cb897c8338e2)
总之,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=1739532524-bsUEQoxCw8EBzuKjFNFrs6PmS5qHD4VD-0-6fefba43d3aa368ea274bf270b93fc72)
功能:用于判断文件是否可读,不可读则报错"No such file or directory:"。
【例4-9】 readable()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_02.jpg?sign=1739532524-KVsseatEroCLqBdKvDhYW1jveNNj3MJ2-0-a2d8db3628d4b93e90f5c04726b83141)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_03.jpg?sign=1739532524-0fbYd3t4V1ffMRw1pXoGcsuWAj2WFETm-0-349ce17c15dc90293ffeb4ed4767a44e)
(2)seek()方法
seek()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_04.jpg?sign=1739532524-yAa3uyMZeJYkchERvcisdy9kKlpEjnNp-0-fb529b6da7fe5f619e7bb243f468ff97)
功能:把文件指针移动到相对于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=1739532524-KrPu77KAVyxYCeRrzmtVhuTjq3DuCdOX-0-030018f0708f5b9e3e964e8531add260)
(3)next()方法
next()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_06.jpg?sign=1739532524-dvcvN70Ez7Crr0Mbu3uUPmQbHvLqnZgY-0-eb79924d2cf4459f7a146d5b7067b364)
功能:用于文件的下一行。
【例4-11】 next()方法举例。
文件test.txt的内容如下:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_07.jpg?sign=1739532524-viZpAruVdIKs1sAHujMFZscKGpa3sQsy-0-e2abc12e2cf0f8efffe4f18cec2436c6)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_01.jpg?sign=1739532524-wkwalZXUv0wGumTVzTqr17P8by6NmIbB-0-c07c11bcb6db57d7b8c3bfbc8bc017e7)
代码如下:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_02.jpg?sign=1739532524-u9Mgn04tGihOl9nLE1bq98BtSZog3q9m-0-d987098ae2cf91cca6472ce946321f20)
输出结果为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_03.jpg?sign=1739532524-Zc3PYKcKs57m0zHlq7zBfFV9UBXABGDB-0-db4c5f9b6cc2c39f3fef2a0762bcec9a)
(4)tell()方法
tell()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_04.jpg?sign=1739532524-ietMOFQ4ud5rl42mMvBIdfOa0zoBWuRQ-0-2a3769c57b4df041f0c803c5df19b4d5)
功能:用于获取文件的当前指针位置,即相对于文件开始位置的字节数。
【例4-12】 tell()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_05.jpg?sign=1739532524-1FvWNQUDDfybqUSm9W4n9mPlBZ14MBTu-0-400b739821b6ff0402b03e7c5cde61be)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_06.jpg?sign=1739532524-WG97LdlrUn9HaB56AIZKYSnsfsPZlpCP-0-a3bc1b5a5ba8ba7b88812a9f96e4ce40)
(5)truncate()方法
truncate()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_07.jpg?sign=1739532524-HzVwnshVGcAL6jmS51jFbZuus0V6GxuI-0-bdf78799b112b42b4999cf63066973e4)
功能:用于截断文件数据,仅保留指定之前指定字节数的数据。
【例4-13】 truncate()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/61_01.jpg?sign=1739532524-YmDOZcanFNKmxCAnErOMuShNBmGuUDyQ-0-df957198c52c0396dce979ce1a76fd55)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/61_02.jpg?sign=1739532524-uFLcOuEGOgvd2x6jkMipDaFO0JMxS0a7-0-5d4032d01745818759d296712c1bdc3a)