![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=1739034389-BszIErb2zmBi0zxCWReDNYBgc8KTsL5O-0-5c290b09e82252a42b065beb71a0b9b3)
参数如下所示。
● filename:filename变量是一个包含了你要访问的文件名称的字符串值。
● mode:mode决定了打开文件的方式,如表4-2所示。
表4-2 Python打开文件方式
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/55_02.jpg?sign=1739034389-hPQB9lBlvX0WHpBwKa37KIwVaACYm77M-0-4db0cef584ae76da7224c3690af8c24c)
(续)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_01.jpg?sign=1739034389-Ji3bUPqa4fNtFfSQm4d7BvEJh3O3mAFm-0-c2c2dea96863a9e71cde69bef2621a21)
【例4-3】 文件打开关闭举例。
在D:\下创建test.txt文本文件,如图4-2所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_02.jpg?sign=1739034389-UEbm18Wz8PKjQUpHXHBEFpug1xpqCWE5-0-8bf32be63bb9c8aad268d50dcec30c2a)
图4-2 test.txt文件
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_03.jpg?sign=1739034389-IskplL1xz7gziVifn7FZwkU1t0JrCdYv-0-203b822266ee29c46303396c40a9c3bd)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/56_04.jpg?sign=1739034389-1tCzE23zQEoPMg0z7jPOLAETpnef7aoK-0-4f05d29f2e2823ab72396a36f5b2a89d)
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=1739034389-Lsj2BWt4oOtBEuK4rS7HIVglDS9CdUCV-0-97393b18d450be07318a38e51b5756a8)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_02.jpg?sign=1739034389-fAJq54fJ0rufuZHsZ1U5mRzDrBf0FhXv-0-e2fe7a00373c0c6447e4d631e9e738b2)
方法二:readline()方法
readline()用于一行行地读出并显示文件内容。如果读到文件末尾,就返回一个空字符串。Readline()函数读取文件的流程如图4-3所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_03.jpg?sign=1739034389-wkNBZgiW7CcUCdupIuMFnusrcigONJLG-0-12ba4e07d792490e75f1478b40755259)
图4-3 readline读取文件
【例4-5】 readline()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_04.jpg?sign=1739034389-gItrCR6U5cI1IqkSAPwfxwiZdD1FCHJ4-0-d93fba18ef42a0147fb0b2f5fa0ef43e)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_05.jpg?sign=1739034389-D8ZeAG1JiEcbk1AhPcHJGuMF29FqSyaW-0-04700ae0d153bf154d34511086825909)
方法三:readlines()方法
readlines()方法自动将文件内容存储为列表。
【例4-6】 readlines()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/57_06.jpg?sign=1739034389-M8ftOxeYgEQGdOYmT2zDx2YQeifeID7a-0-b3bd9eee4759edb6748f5a31f44ad333)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/58_01.jpg?sign=1739034389-EBWPsNSuS6etC3tf9iGOti0aiCHBiZ9Z-0-b0e0f4c8e05477770b7ecaba00d26ffb)
总之,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=1739034389-hJJdWFGrCspQPcpJ4K6QoVi4adluuSFD-0-82a1fdd6031b2f7a4098858eb4792878)
方法二:writelines()方法
writelines()的参数是序列,比如将列表写入文件。
【例4-8】 writelines方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/58_03.jpg?sign=1739034389-Kni0K9QIeUsYLgDBQG8LYQsW6mK0284Z-0-90f4134983d6b2813649d98c1b401efa)
总之,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=1739034389-YjI4A4EWdCZ4rSzy0GQphcBOpkWjkF4p-0-7d8640ad0d1aaf7d68c9e3495f8b6fb5)
功能:用于判断文件是否可读,不可读则报错"No such file or directory:"。
【例4-9】 readable()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_02.jpg?sign=1739034389-SADS3P2mCKsLa2e9MZohNG109f4NHU9r-0-1ac3645cb7b069054432cfecf94acc1c)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_03.jpg?sign=1739034389-9y9QbypSdOKSdue49Tc5uccmSytolEqV-0-a426f841a4b536797dca6cf95eab4ae3)
(2)seek()方法
seek()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_04.jpg?sign=1739034389-xiraW5M9t5LgP5qj6aFVoO4ZxHgSxs9H-0-b0beebcf6928791a82edb4b85a49fdc4)
功能:把文件指针移动到相对于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=1739034389-y08PbUQos6dt8g41TmJ8bdRA90LkOgvo-0-09a4ba0ad4c5fa9bd1084b5b0493379d)
(3)next()方法
next()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_06.jpg?sign=1739034389-4uDjic1lKo8gH9I1PsAZKtB1LDbL9TqI-0-2fbba86bd32a0c1db42b8ba896a89a9c)
功能:用于文件的下一行。
【例4-11】 next()方法举例。
文件test.txt的内容如下:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/59_07.jpg?sign=1739034389-4twJljTkWcGE6CIrlhmsfQmZmETG2acV-0-d9768202b63c7684e2b4b198dbf09e8c)
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_01.jpg?sign=1739034389-Sim4GdouuPHUSjWSPPsZuaQtBtpfLKHL-0-20402c474026db13d31785adeb902ea2)
代码如下:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_02.jpg?sign=1739034389-ISEZn4TOfCm2nP1WVKFxCPMOnyYn8RqQ-0-272e70ee08fee10e441064329a27e543)
输出结果为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_03.jpg?sign=1739034389-UEaPEO9kZIuZESvDsljV6LcsElUkZayP-0-5c595eaf21e66e0ef8a5a3c8f10a5bda)
(4)tell()方法
tell()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_04.jpg?sign=1739034389-XVfrFdx0gDwdd4FNqc6fsTYDxOQRJlWO-0-a422b8eccf72b4dde3d90370e38c8fad)
功能:用于获取文件的当前指针位置,即相对于文件开始位置的字节数。
【例4-12】 tell()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_05.jpg?sign=1739034389-cEWOPidyviR1EsQ5D2IP2tZGE32Jkc1e-0-e3665e8fb9f5e53188edc314bde2f959)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_06.jpg?sign=1739034389-JBSQK55fHK9n7noTO3zei4xjzLu4bPUU-0-c63da05f8ed47f94cbc96eb2bb89451c)
(5)truncate()方法
truncate()方法一般形式为:
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/60_07.jpg?sign=1739034389-HC1UI9YOOyOKtPY5B5tqBOCHP0M31z7R-0-a3e3aaded029f0efca7e748be8215163)
功能:用于截断文件数据,仅保留指定之前指定字节数的数据。
【例4-13】 truncate()方法举例。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/61_01.jpg?sign=1739034389-wkyHUC1xeFvWLIyM7VI6SN6BN7aTYoNU-0-eff34bdfda4279f78b6b0ebec9fc8199)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/1536BF/18123625601962306/epubprivate/OEBPS/Images/61_02.jpg?sign=1739034389-m458eXIcvvrSWilZzi8iH60GlCZf9foa-0-4d5e82084dbf9cf6efb05589d127d8a5)