python文件以及目录操作
一、基本文件操作:
1、创建和打开文件:
在Python中,想要操作文件需要先创建或者打开指定的文件并创建文件对象,可以通过内置的open()函数实现,语法格式如下:
file=open(filename,mode,buffering)
参数说明:
- file:被创建的文件对象
- filename:要创建或打开的文件名字,需要用单引号或者双引号括起来,如果在同一级目录下可直接写文件名,否则需要写明文件详细路径。
- mode:可选参数,用于指定文件的打开模式。
- buffering:可选参数,用于指定读写文件的缓冲模式,值为0表示不缓存,为1表示缓存,大于1表示缓冲区大小,默认为缓存模式。
mode参数值说明如下:
| 值 | 说明 |
| r | 以只读模式打开文件 |
| rb | 以二进制格式打开文件,采用只读模式,适用非文本文件,如图片、声音 |
| r+ | 可以读取内容,也可以写入新内容覆盖原内容 |
| rb+ | 以二进制打开,采用读写模式,适用非文本文件,如图片、声音 |
| w | 以只写模式打开文件 |
| wb | 以二进制打开,采用只写模式,适用非文本文件,如图片、声音 |
| w+ | 打开文件,清空原内容,对空文件有读写权限 |
| wb+ | 以二进制打开,采用读写模式,适用非文本文件,如图片、声音 |
| a | 以追加模式打开文件,新内容追加到原内容后,没有文件将创建新文件用于写入 |
| ab | 以二进制格式打开文件,并且采用追加模式,没有文件将创建新文件用于写入 |
| a+ | 以读写模式打开文件,并采用追加模式,没有文件将创建新文件用于读写 |
| ab+ | 以二进制打开文件,采用追加模式,没有文件将创建新文件用于读写 |
上面的r、rb、r+、rb+四个参数必须保证文件存在,其余的表示文件存在则将其覆盖,没有则新建文件。
例如:打开一个不存在的文件时将出现如下错误,如图:

要解决以上错误,有两种方法:
一是在对应路劲下创建文件test.txt
二是在调用open()函数的时候,指定mode参数值为a、a+、w、w+ ,当打开的文件不存在时会自动创建新文件,如图:

注:如果open()中没有指定打开模式,默认为只读模式,指定encoding=utf-8可以防止乱码,对于二进制文件,使用'rb'或'wb'模式,此时不需要指定编码
2、以二进制的形式打开文件:
通过open()函数不仅可以打开文本,还可以以二进制形式打开非文本文件,比如视频、图片、音乐等。
例如:打开已经存在的图片文件15.png,如图:

打印结果如下:

从上图中可以看出,打印结果创建的是一个BufferedReader对象,该对象生成后可以在使用其他第三方模块进行处理即可。
3、打开文件时指定文件编码:
在使用open()函数打开文件时,默认是GBK编码,当打开的文件不是GBK编码的时候将抛出UnicodeDecodeError异常,解决方法第一种是直接修改文件编码,第二种是打开文件的时候指定其他编码(推荐第二种方式)。
在调用open()函数的时候,通过添加encoding=”utf-8″ 即可将编码指定为utf-8的形式,如果要指定为其他形式,将双引号中的内容替换即可。
例如:打开采用utf-8编码保存的test.txt文件,使用命令如下:
file=open(“test.txt”,”r”,encoding=”utf-8″)
4、关闭文件:
打开文件后,需要及时关闭,以免对文件造成破坏,关闭文件可以使用文件对象的close()方法实现,语法格式如下:
file.close()
说明:close()先刷新缓冲区中还没有写入的信息,然后再关闭文件,可以将内容及时写入到文件中,文件关闭后无法继续写入。
5、打开文件使用with语句:
如果打开文件时出现了异常将导致文件无法正常关闭,为了避免此类情况,可以使用with语句,这样无论是否出现异常,都可以保证with语句执行完成后都可以及时关闭打开的文件,语法格式如下:
with expression as target:
with-body
参数说明:
- expression:表达式,可以是打开文件的open()函数
- target:用于指定一个变量,将expression结果保存到变量中
- with-body:用于指定with语句体,可以是执行with语句后的一些操作语句,如果不想执行任何操作,可以使用pass语句代替
例如:创建test.py文件,在内部打开文件test.txt使用with语句,如图:

注意:使用with语句后,就不用写close()了,因为with执行后会默认关闭文件,可防止忘记关闭文件的情况
6、写入文件内容:
Python文件对象提供了write()方法,可以向文件中写入内容,语法格式如下:
file.write(string) #write()中只能写入字符串,如果要写入整数需要先转换为字符串
其中file为打开的文件对象,string表示要写入的字符串
说明:在调用write()方法向文件中写入内容时,打开文件的模式必须为w(可写)或者a(追加),否则将抛出异常。
例如:创建模块test.py,打开文件test.txt并通过追加形式写入内容,如图:

注意:在写入文件后,一定要调用close()方法关闭文件,否则内容无法保存到磁盘中,如果不想马上关闭文件,也可以调用文件对象的flush()方法,把缓冲区的内容写入文件,也可以保证数据全部写入磁盘。
向文件写入内容时,如果打开文件的模式是w(写入)模式,则会清空原内容在写入新内容,如果打开文件的模式是a(追加)模式,则是在原有文件基础上在后面追加新内容。
在Python文件对象中除了提供write()方法,还有writelines()方法,可以将字符串列表写入到文件,但是不添加换行符。
也可以通过print()方法进行写入,如图:

说明:打开文件并保存到fp对象中,将print内容写入到文件中,关闭fp对象,读取路径前加r或者R,那么就不需要对路径分隔符进行转义
7、读取文件内容:
读取文件内容主要分为以下几种情况:
第一种:读取指定字符:
文件对象的read()方法可以读取指定个数的字符,返回的是字符串,语法格式如下:
file.read(size) #返回结果为字符串
参数说明:
- file:要打开的文件对象
- size:可选参数,表示要读取的字符个数,如果不指定则读取全部内容
注意:在调用read()方法读取字符的前提是打开文件时,指定的打开模式为r(只读)或者r+(读写)模式,否则将抛出异常。
例如:通过with语句打开文件,以只读方式打开,读取前10个字符,如图:

使用read(size)方法读取文件时,默认是从开头读取的,如果要读取部分内容,可以先使用seek()方法将指针移动到新的位置,然后再使用read(size)方法读取,语法格式如下:
file.seek(offset,whence)
参数说明:
- file:表示打开的文件对象
- offset:指定的移动字符个数,具体位置与whence参数有关
- whence:指定从什么位置开始计算,值为0表示从文件头开始计算,值为1表示从当前位置开始计算,值为2表示从文件结尾开始计算,默认为0
例如:定义模块test.py,打开文件,将文件指针移动12个位置,读取前10个字符,如图:

注意:在使用seek()方法的时候,如果使用GBK编码,那么offset按照一个汉字(包括中文标点)占两个字符计算,如果采用UTF-8编码,那么一个汉字占用3个字符,无论采用何种编码,英文和数字都是按照一个字符计算。
对于whence参数,如果在打开文件时,没有使用b模式(即rb),那么只允许从文件头开始计算相对位置,从文件尾计算时会引发错误
第二种:读取一行:
(1)、在使用read()方法读取文件的时候,如果一次性读取所有内容到内存,容易造成内存不足,通常采用逐行读取的方式,可以使用文件对象的readline()方法,每次读取一行数据,语法格式如下:
file.readline() #返回结果为字符串
其中,file表示打开的文件对象,打开文件的时候,也要指定打开模式r(只读)或者r+(读写模式)
例如:定义test.py模块,通过readline读取文件一行,通过while循环读取每一行,如图:

(2)、通过for循环来读取每一行内容,如图:

注:如果不加rstrip(),打印的结果中有空行,因为每行的末尾都有一个看不见的换行符
第三种:读取全部行:
通过文件对象的readlines()方法,语法格式如下:
file.readlines() #返回结果为字符串列表
其中,file表示打开的文件对象,打开文件时也需要指定打开模式r(只读)或者r+(读写)
例如:定义模块test.py,通过readlines()方法读取全部行,如图:

打印结果如下:

从打印结果可以看到,结果为一个字符串列表,通过for循环可以打印,如图:

8、目录操作:
在Python中,内置了os模块及其子模块os.path用于对文件或者目录进行操作,使用之前需要通过import语句导入
注意:导入os模块后,也可以使用子模块os.path
例如:导入os模块,使用此模块的name变量查看系统类型,如图:

如果结果是posix表示是Linux、Unix、或者MacOS系统,如果是nt表示windows系统
os模块提供的与目录相关的函数如下:
| 函数 | 说明 |
| getcwd() | 返回当前的工作目录 |
| listdir(path) | 返回指定路径下的文件和目录信息 |
| mkdir(paht,mode) | 创建目录 |
| makedirs(/path1/path2) | 创建多级目录 |
| rmdir(path) | 删除目录 |
| removedirs(path1/path2) | 删除多级目录 |
| chdir(path) | 设置path为当前工作目录 |
| walk | 遍历目录树,返回一个数组 |
os.path模块提供的与目录相关的函数如下:
| 函数 | 说明 |
| abspath(path) | 获取文件或目录的绝对路径 |
| exists(path) | 判断路径或文件是否存在,存在返回true,否则返回false |
| join(path,name) | 将目录与目录或者文件名拼接起来 |
| splitext() | 分离文件名和扩展名 |
| basename(path) | 从一个目录中提取文件名 |
| dirname(path) | 从一个路径中提取文件路径,不包括文件名 |
| isdir(path) | 用于判断是否为有效路径 |
例如:通过os模块的getcwd()函数,获取当前路劲,如图:

在Python中,指定文件路径的时候,需要对路径分隔符进行转义,通过”\”,否则将报oserror
例如,通过open()方法打开一个文件,需要通过转义符进行转义,如图:

如果在打开路径前面加上字母r或者R,那么就不需要再进行转义,如图:

通过os.path模块的exists()函数判断文件或目录是否存在,存在返回True,如图:

通过os模块的mkdir()函数创建目录,如图:

通过rmdir()函数删除目录的时候,只能删除空的目录,如果要删除非空目录,需要使用内置模块shutil的rmtree()函数实现,需要先导入shutil模块。
遍历目录可通过os模块的walk()方法实现,返回一个包括三个元素的元祖,如图:

打印后的结果如图所示:

注意:walk()函数只能在linux系统和windows系统中使用
9、高级文件操作:
os 模块提供了与文件相关的函数,如下:
| 函数 | 说明 |
| access(path,accesmode) | 获取对文件是否有指定的访问权限,accessmode的值是R_OK(读取)、W_OK(写入)、X_OK(执行)、F_OK(存在),如果有指定权限,返回1,否则返回0 |
| chmod(path,mode) | 修改path指定文件的访问权限 |
| remove(path) | 删除path指定的文件路径 |
| rename(src,dst) | 将文件或目录src重命名为dst |
| stat(path) | 返回path指定文件的信息 |
| startfile(path,operation) | 使用关联应用程序打开path指定的文件 |
9.1 删除文件:
例如:通过os模块的remove()方法删除指定文件,如图:

如果文件不存在的时候删除会报错,因此可以先通过os.path模块判断文件是否存在,如图:

9.2 重命名文件和目录:
os模块的rename()函数用于重命名为文件和目录,如果指定的路径为文件,则重命名文件,如果指定的路径为目录,则重命名目录。
例如:定义模块rename.py,判断文件hello是否存在,如果存在重命名为world,如图:

注意:在使用rename()函数重命名的时候,只能修改最后一级的目录,否则会报错。
9.3 获取文件的基本信息:
通过os模块的stat()函数可以获取文件的基本信息,stat()函数的返回值为一个对象,该对象包含如下属性,通过访问对应的属性可获取文件的基本信息
stat()函数返回的对象常用属性属性如下:
| 属性 | 说明 |
| st_mode | 保护模式 |
| st_info | 索引号 |
| st_nlink | 硬链接号(被连接数目) |
| st_size | 文件大小,单位为字节 |
| st_mtime | 最后一次修改时间 |
| st_dev | 设备名 |
| st_uid | 用户ID |
| st_gid | 组ID |
| st_atime | 最后一次访问时间 |
| st_ctime | 最后一次状态改变的时间 |
例如:定义模块stat.py,通过stat()函数获取文件信息,通过对象属性访问文件信息,如图:



