![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=1739049236-DxN72IdYUstWpsfwSGqYnClXqc96j9Xf-0-a577617e9d1ac28b593f929ba37f6ceb)
参数如下所示。
● filename:filename变量是一个包含了你要访问的文件名称的字符串值。
● mode:mode决定了打开文件的方式,如表4-2所示。
表4-2 Python打开文件方式
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/55_02.jpg?sign=1739049236-JgvAQgodUXNUv31U1wrYVhijplZ8Q3a7-0-c38815a88ca6e49bace0062a9ae99dc1)
(续)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_01.jpg?sign=1739049236-vXWY7k64GAJOHWg17nBcKTpOYqNe4pnk-0-fc3075fe4b3e9edb908b27d8b767d399)
【例4-3】 文件打开关闭举例。
在D:\下创建test.txt文本文件,如图4-2所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_02.jpg?sign=1739049236-d5K8YOp0rQtjOy3n18w9n4Khuuy0SRIj-0-e8ca69c11661bfa41a0f2800da8af082)
图4-2 test.txt文件
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_03.jpg?sign=1739049236-bj7JqZHo2MCHzuSQfrRKZpA0qDmD4aEM-0-693ba38a15279dfb20073755fabd70d3)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_04.jpg?sign=1739049236-wwHN6REl1mYM7NWRGxI7KFcJfHVyaLiq-0-24eaad57ef5253b9180d3cf0d3ab9ecd)
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=1739049236-BtAA4PbyNkSgdSMKeRsihFOzhioD9CXO-0-d72a2dddc4420bc70c84d9b7846a12d2)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_02.jpg?sign=1739049236-u1sVVlGEFW1WL8Zz6KU1SWwiKnvbcfpv-0-327cb61c9ca91aa8039f058c38b89dd3)
方法二:readline()方法
readline()用于一行行地读出并显示文件内容。如果读到文件末尾,就返回一个空字符串。Readline()函数读取文件的流程如图4-3所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_03.jpg?sign=1739049236-6nF6Hk3weySb3elxgMLygrf9ZGUddRV5-0-61db0f9b6c54628b79a1bc7f373645d9)
图4-3 readline读取文件
【例4-5】 readline()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_04.jpg?sign=1739049236-rmsyrategLjeuTqBaQid9FWCTmuIqIgC-0-6c1a4a1b446b6e044eac68ac5ba5fa4a)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_05.jpg?sign=1739049236-5XUUNHB9LTkkQCiop8tKzuD32N5mfpRw-0-ebe6d9328d6b434413d57d86c8cbf2c3)
方法三:readlines()方法
readlines()方法自动将文件内容存储为列表。
【例4-6】 readlines()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_06.jpg?sign=1739049236-v8H2ESRCHGqz2sL8rx1pIQrcbHFMjTYI-0-420f797afede2a112debc9e6f56ef867)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/58_01.jpg?sign=1739049236-1rNzQMLLWOF4EdFGEfnXe6FnSYXGkKeu-0-73f6ce79618ae87ec38974cc6fd2ed93)
总之,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=1739049236-IuXCPJ2UzCckc2ZOoxcN18ieOMkFZIZa-0-a81fc68702e40d8f7cb9487a29f1ba58)
方法二:writelines()方法
writelines()的参数是序列,比如将列表写入文件。
【例4-8】 writelines方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/58_03.jpg?sign=1739049236-6qtgBt07WG3IAKpK4n8cE8pqTVC5wHOT-0-07ccc11631c53edbabc55d5eb7f050af)
总之,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=1739049236-D3UB4NVZFgT8l1SPYtDQlR0JOsefOWmE-0-fcd39a181392d8ed5c9504e5e1151b1f)
功能:用于判断文件是否可读,不可读则报错"No such file or directory:"。
【例4-9】 readable()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_02.jpg?sign=1739049236-2zd7YjEDbHeU92YSMtDLeiFanU4Zh9PU-0-85ab7e379e3d487c8644d352cb0f167b)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_03.jpg?sign=1739049236-SXJ3ZBCcLiz62LXPCEbV7JH8mRq8hCSg-0-5b2538a4a6d6687b2a31c95f2c3e7c19)
(2)seek()方法
seek()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_04.jpg?sign=1739049236-1jyzWUrJwxPCvZ9mvmD6EzicA1vJ1jFi-0-ae4bd4f701a974612392bf1221107ce4)
功能:把文件指针移动到相对于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=1739049236-SrLwOBDk0fPHIpQZ3QuGaSNpWT9F4lSw-0-76aab30f58f091f15ccb216ee91efbf9)
(3)next()方法
next()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_06.jpg?sign=1739049236-prvjDKzwDVZ21bHqk9H67a4P2gHTsBVF-0-27515ebae3b76dc1e180cfe5c04fd853)
功能:用于文件的下一行。
【例4-11】 next()方法举例。
文件test.txt的内容如下:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_07.jpg?sign=1739049236-IzkOEaupKHfjYZUBf4WgUMdrG6XArWhA-0-16b74f2e544533e7d90a5fc15c7c5794)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_01.jpg?sign=1739049236-g0JLiTeyCLZQtZWEbxYXbr5bYyHay370-0-67b4ee3e008fa66bf383577b7a2619a9)
代码如下:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_02.jpg?sign=1739049236-Xcm7QUuJPGyHoaFdJ0lx8okOkCXr7TKj-0-745f9e115f08fb77a7d52efc31ba8f15)
输出结果为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_03.jpg?sign=1739049236-clcc5o3sghrW0IlFu9wdAyl3EVWsuXsZ-0-a848f663d3138d9f6da0cf434858e80f)
(4)tell()方法
tell()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_04.jpg?sign=1739049236-dy91Naz0lRifSrElyiIaGYTLXd1RL9nP-0-40e00b76f0af43dde644182b3c4ab56b)
功能:用于获取文件的当前指针位置,即相对于文件开始位置的字节数。
【例4-12】 tell()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_05.jpg?sign=1739049236-InYqebBbpdGzekx3aYgld0EyY2HFPrEv-0-c5fa051cbe2abfcc1f2349f3d580a819)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_06.jpg?sign=1739049236-swOYN3ri63I2i9nPCcyheyIfK3T3Ekco-0-fdf20889379e66fb430efb240bbc64b7)
(5)truncate()方法
truncate()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_07.jpg?sign=1739049236-XzxxCHLyKLmba9s9FQvym8hW7BdGJFgP-0-4624e59ea43584713092afc1f8428e1b)
功能:用于截断文件数据,仅保留指定之前指定字节数的数据。
【例4-13】 truncate()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/61_01.jpg?sign=1739049236-IqBfc0sZq3f7ldHcMp9HJgmRcpnAHrHR-0-c0b0e2340cbe135248b3a381ea28a80d)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/61_02.jpg?sign=1739049236-gqFknhSB73YnzAbWydVfxFjlBVN9NsqC-0-27f165e57e407357b3cdf2d741518ea0)