python文件以及目录操作

一、基本文件操作:

1、创建和打开文件:

在Python中,想要操作文件需要先创建或者打开指定的文件并创建文件对象,可以通过内置的open()函数实现,语法格式如下:

file=open(filename,mode,buffering)

参数说明:

  1. file:被创建的文件对象
  2. filename:要创建或打开的文件名字,需要用单引号或者双引号括起来,如果在同一级目录下可直接写文件名,否则需要写明文件详细路径。
  3. mode:可选参数,用于指定文件的打开模式。
  4. 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

参数说明:

  1. expression:表达式,可以是打开文件的open()函数
  2. target:用于指定一个变量,将expression结果保存到变量中
  3. 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)    #返回结果为字符串

参数说明:

  1. file:要打开的文件对象
  2. size:可选参数,表示要读取的字符个数,如果不指定则读取全部内容

注意:在调用read()方法读取字符的前提是打开文件时,指定的打开模式为r(只读)或者r+(读写)模式,否则将抛出异常。

例如:通过with语句打开文件,以只读方式打开,读取前10个字符,如图:

使用read(size)方法读取文件时,默认是从开头读取的,如果要读取部分内容,可以先使用seek()方法将指针移动到新的位置,然后再使用read(size)方法读取,语法格式如下:

file.seek(offset,whence)

参数说明:

  1. file:表示打开的文件对象
  2. offset:指定的移动字符个数,具体位置与whence参数有关
  3. 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()函数获取文件信息,通过对象属性访问文件信息,如图:

标签