# 第十一章 文件读写
在使用python编程时,经常会遇到读写文件的操作,比如配置文件,数据存储都是对文件操作。不管你将来是需要写爬虫、Web开发、小程序等等,都离不开文件,那么文件的操作就是要学习起来的了。
文件是系统存储区域的一个命名位置,用来存储一些信息,便于后续访问。当我们要读取或者写入文件时,我们需要打开文件;在操作完毕时,我们需要关闭文件,以便释放和文件操作相关的系统资源。
很多童鞋困扰于读写文件的各种模式(如阅读、写入、追加等),以及搞不清open、read、readline、readlines、write等方法的使用。
这篇文章就是要告诉你Python文件读写的所有秘密!
## 一、文件打开和关闭
### 1、文件打开
Python中打开文件命令 open(),open命令返回文件的一个对象。如果你想用python读取文件(如txt、csv等),第一步要用open函数打开文件。open()是python的内置函数,它会返回一个文件对象,这个文件对象拥有read、readline、write、close等方法。
#### 1)、open函数
open函数有两个参数:
参数file:需要打开的文件路径,参数mode(可选):打开文件的模式,如只读、追加、写入等。
#### 2)、with 关键字
在打开文件时,很多人通常直接用open('file'),这样并不酷。最好使用 with 关键字。优点是当子句体结束后文件会自动调用close()方法正确关闭,即使在某个时刻引发了异常。
as含义:将前面进行操作的文本文件赋予f这个对象,能够简约代码,提高代码阅读能力。
#### 3)、文件打开模式
### 2、文件关闭
打开文件并处理完毕后,需要关闭文件,这里用到close方法。
#### 1)、close()方法
f.close() 用来关闭文件并立即释放它使用的所有系统资源。如果你没有显式地关闭文件,Python的垃圾回收器最终将销毁该对象并为你关闭打开的文件,但这个文件可能会保持打开状态一段时间。
应该要养成使用close()的习惯。
## 二、文件读取、写入
### 1、文件读取
#### 1)、read()方法
当使用open函数打开文件后,就可以使用该文件对象的各种方法了,read就是其中一种。read()会读取文件所有数据并将其作为字符串(在文本模式下)或字节对象(在二进制模式下)返回。
首先,我们需要知道的一个小知识点,要读取UTF-8编码的文本文件,需要给open()函数传入encoding参数。遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略。
open('test.txt', 'r', encoding='utf-8', errors='ignore')
执行该代码,结果为:
#### 2)、read(size)方法
每次最多读取指定长度的内容,返回一个str,size指定的是字符长度。
执行该代码,结果为:
#### 3)、readline()方法
每次读取一行内容,返回类型str。
执行该代码,结果为:
#### 4)、readlines()方法
一次读取所有内容并按行返回list。
执行该代码,结果为:
### 3、文件写入
写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件。
#### 1)、write()方法
write()方法和read()、readline()方法对应,是将字符串写入到文件中。将字符串写入文件,如果写入结束,需要在字符串后面加上"
"
执行该代码,结果为为空,然后,再打开song.txt文件,显示的内容是:
注意:'w'这个模式是酱紫:如果没有这个文件,就创建一个;如果有,那么就会先把原文件的内容清空再写入新的东西。所以若不想清空原来的内容而是直接在后面追加新的内容,就用'a'这个模式。
#### 2)、writelines()方法
writelines()方法和readlines()方法对应,也是针对列表的操作。它接收一个字符串列表作为参数,将他们写入到文件中,换行符不会自动的加入,因此,需要显式的加入换行符。
以a写入形式在文本末尾追加新的内容
执行该代码,结果为:
#### 3)、seek()和tell()方法
seek():这是光标指定位置的方法,可传入参数seek((offset,from_what),from_what值为文件的开始位置,可以省略;offset为偏移量。f.seek(2,0)读取位置向后移动2个字符。
tell():当前文件游标的位置。
执行该代码,结果为:
## 三、文件目录操作
我们在电脑中可以创建新的目录,也可以修改原有目录的名称,和删除目录,不过删除目录时需要谨慎,防止误删除重要的文件。这些目录的操作都是通过程序来完成的,这个程序就是电脑中的资源管理器。
用Python语言也可以编写一个资源管理器程序,Python提供了有关文件目录操作的一些方法,这些方法可以帮助我们编写电脑的资源管理器程序。下面我们将逐步介绍这些方法,首先会介绍如何在电脑中创建和删除目录,然后再介绍如何修改目录名称。后面的文章会介绍如何遍历目录和文件。当我们掌握了这些操作目录的方法后,就可以使用Python语言编写资源管理器程序了。
Python操作目录的方法包含在OS模块中,在代码中需要导入OS模块。
### 1、创建目录
执行以上代码,可以去D盘验证,会发现,D盘下有了text1和text2这两个文件夹。
### 2、创建多级目录
执行改代码,可以去D盘验证:
### 3、删除目录
当目录不再需要或用户删除目录时,我们可以使用rmdir方法来删除指定的目录,删除目录时需要慎重,因为该目录下的所有文件都会被删除。
使用rmdir方法删除指定的目录,删除的目录路径为“D:/text3/text”,在执行rmdir方法删除text目录之前,需要确保text目录是存在的。
执行改代码,text3目录下为空。
删除多级目录,使用removedir方法。可课后练习一下。
### 4、修改目录名称
当用户需要修改已有目录的名称时,可以使用rename方法来修改已有的目录名称,rename方法要求传入两个参数,第一个参数是需要修改目录名称的目录路径,第二个参数是修改后的目录路径。
执行该代码,结果就可以在D盘text4里验证。
### 5、os.path路径操作
#### 1)、os.path()模块
os.path 模块主要用于获取文件的属性。下面举例常用的一些方法:
- os.path.basename(path) 返回文件名
- os.path.abspath(path) 返回绝对路径
- os.path.relpath(path) 返回相对路径
- os.path.dirname(path) 返回文件路径
- os.path.exists(path) 如果路径 path 存在,返回 True;如果路径 path 不存在,返回 False。
- os.path.isdir(path) 判断路径是否为目录
- os.path.join(path1[, path2[, ...]]) 把目录和文件名合成一个路径
- os.path.split(path) 把路径分割
#### 2)、os.path()案例
执行以上代码,结果为:
## 四、课堂练习
#### 1、写一个简单的复制文件代码:通过函数的形式,使用参数能够传递的方法,进行赋值。
#### 2、写一个能够遍历某目录下所有内容的函数:①简单形式:文件夹里全部都是文件;②复杂形式:文件夹里有文件夹和文件。
## 五、上一节课堂练习答案
#### 1、现有如图所示的两个类,定义一个Child类继承这两个类,并且重写__init__方法,在实例化Child时候,调用ParentA类的__init__方法。
如下图所示:
执行该代码,结果为:
#### 2、
如下图所示:
执行该代码,结果为: