零基础学Python--------第10章 文件及目录操作

第10章 文件及目录操作

10.1 基本文件操作

在Python中,内置了文件(File)对象。在使用文件对象时,首先需要通过内置的open() 方法创建一个文件对象,然后通过对象提供的方法进行一些基本文件操作。例如,可以使用文件对象的write() 方法向文件中写入内容,以及使用close() 方法关闭文件等。下面将介绍如何应用Python的文件对象进行基本文件操作。

10.1.1 创建和打开文件

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

file = open(filename[,mode[,buffering]])

 

参数说明:

  • file:被创建的文件对象。
  • filename:要创建或打开文件的文件名称,需要使用单引号或双引号括起来。如果要打开的文件和当前文件在同一个目录下,那么直接写文件名称即可,否则需要制定完整路径。例如,要打开当前路径下的名称为status.txt 的文件,可以使用“status.txt”。
  • mode:可选参数,用于指定文件的打开模式,其参数值如下表。默认的打开模式为只读(即r)。
mode 参数的参数值说明
说明 注意
r 以只读模式打开文件,文件的指针将会放在文件的开头 文件必须存在
rb 以二进制格式打开文件,并且采用只读模式。文件的指针将会放在文件的开头,一般用于非文本文件,如图片、声音等
r+ 打开文件后,可以读取文件内容,也可以写入新的内容覆盖原有内容(从文件开头进行覆盖)
rb+ 以二进制格式打开文件,并且采用读写模式。文件的指针将会放在文件的开头。一般用于非文本文件,如图片、声音等
w 以只写模式打开文件 文件存在,则将其覆盖,否则创建新文件
wb 以二进制格式打开文件,并且采用只写模式。一般用于非文本文件,如图片、声音等
w+ 打开文件后,先清空原有内容,使其变为一个空的文件,对这个空文件有读写权限
wb+ 以二进制格式打开文件,并且采用读写模式。一般用于非文本文件,如图片、声音等
a 以追加模式打开一个文件。如果该文件已经存在,文件指针将放在文件的末尾(即新内容会被写入到已有内容之后),否则,创建新文件用于写入  
ab 以二进制格式打开文件,并且采用追加模式。如果该文件已经存在,文件指针将放在文件的末尾(即新内容会被写入到已有内容之后),否则,创建新文件用于写入  
a+ 以读写模式打开文件。如果该文件已经存在,文件指针将放在文件的末尾(即新内容会被写入到字节的内容之后),否则,创建新文件用于读写  
ab+ 以二进制格式打开文件,并且采用追加模式。如果该文件已经存在,文件指针将放在文件的末尾(即新内容会被写入到已有内容之后),否则,创建新文件用于读写  
  • buffering:可选参数,用于指定读写文件的缓冲模式,值为0表达式不缓存;值为1表示缓存;如果大于1,则表示缓冲区的大小。默认为缓存模式。

使用open()方法可以实现以下几个功能:

1. 打开一个不存在的文件时先创建该文件

在默认的情况下,使用open() 函数打开一个不存在的文件,会抛出如下异常。

要解决上图错误,主要有以下两种方法:

  • 在当前目录下(即与执行的文件相同的目录)创建一个名称为status.txt 的文件。
  • 在调用open() 函数时,指定mode 的参数值为 w、w+、a、a+。这样,当打开的文件不存在时,就可以创建新的文件了。

实例01:创建并打开记录蚂蚁庄园动态的文件

首先输出一条提示信息,然后再调用open() 函数创建或打开文件,最后在输出一天提示信息,代码如下:

print("\n","="*10,"蚂蚁庄园动态","="*10)
file = open('message.txt','w')              # 创建或打开保存蚂蚁庄园动态信息的文件
print("\n 即将显示……\n")

 

2. 以二进制形式打开文件

使用open() 函数不仅可以以文本的形式打开文本文件,而且还可以以二进制形式打开非文本文件,如图片文件、音频文件、视频文件等。例如,创建一个名称为picture.png的图片文件,并且应用open() 函数以二进制方式打开文件。

以二进制方式打开该文件,不输出创建的对象的代码如下:

file = open('picture.png','rb')         # 以二进制方式打开图片文件
print(file)                             # 输出创建的对象

 

3. 打开文件时指定编码方式

在使用open() 函数打开文件时,默认采用GBK编码,当被打开的文件不是GBK编码时,将抛出异常。

在调用open() 函数时,通过添加encoding='utf-8'参数即可实现将编码指定为UTF-8.如果想要指定其他编码,可以将单引号中的内容替换为想要指定的编码即可。

file = open('notice.txt','r',encoding='utf-8')

 

10.1.2 关闭文件

 打开文件后,需要及时关闭,以免对文件造成不必要的破坏。关闭文件可以使用文件对象的close() 方式实现。close() 方法的语法格式如下:

file.close()

 

其中,file 为打开的文件对象。

例如,关闭实例01中打开的file 对象,可以使用下面的代码:

flie.close()             # 关闭文件对象

 

说明:close() 方法先刷新缓冲区中还没有写入的信息,然后再关闭文件,这样可以将没有写入到文件的内容写入到文件中。在关闭文件后,便不能再进行写入操作了。

10.1.3 打开文件时使用with 语句

打开文件后,要及时将其关闭,如果忘记关闭可能会带来意想不到的问题。另外,如果在打开文件时抛出异常,那么将导致文件不能被及时关闭。为了更好地避免此类问题发生,可以使用Python 提供的with 语句,从而实现在处理文件时,无论是否抛出异常,都能保证with 语句执行完毕后关闭已经打开的文件。with 语句的基本语法格式如下:

with expression as target:
    with-body

 

参数说明:

  • expression:用于指定一个表达式,这里可以是打开文件的open() 函数。
  • target:用于指定一个变量,并且将expression的结果保存到该变量中。
  • with-body:用于指定with 语句体,其中可以是执行with 语句后相关的一些操作语句。如果不想执行任何语句,可以直接使用pass 语句代替。

例如,将实例01修改为在打开文件时使用with 语句,修改后的代码如下:

print("\n","="*10,"蚂蚁庄园动态","="*10)
with open('message.txt','w') as file:             # 创建或打开保存蚂蚁庄园动态信息的文件
    pass
print("\n 即将显示……\n")

 

10.1.4 写入文件内容

在实例01中,虽然创建并打开一个文件,但是该文件中并没有任何内容,它的大小是0KB。Python 的文件对象提供了write() 方法,可以向文件中写入内容。write() 方法的语法格式如下:

file.write(string)

 

其中,file 为打开的文件对象;string 为要写入的字符串。

注意:在调用write() 方法向文件中写入内容的前提是在打开文件时,指定的打开模式为w(可写)或者a(追加),否则,将抛出异常。

实例02:向蚂蚁庄园的动态文件写入一条信息

首先应用open() 函数以写方式打开一个文件,然后再调用write() 方法向该文件中写入一条动态信息,再调用close() 方法关闭文件,代码如下:

print("\n","="*10,"蚂蚁庄园动态","="*10)
file = open('message.txt','w')             # 创建或打开保存蚂蚁庄园动态信息的文件
# 写入一条动态信息
file.write("你使用了1张加速卡。\n")
print("\n 写入了一条动态……\n")
file.close()                # 关闭文件对象

 

执行上面的代码:

并创建了一个message.txt 的文件

注意:在写入文件后,一定要调用close() 方法关闭文件,否则写入的内容不会保存到文件中。这是因为当我们写入文件内容时,操作系统不会立刻把数据写入磁盘,而是先缓存起来,只有调用close() 方法时,操作系统才会保证把没有写入的数据全部写入磁盘。

多学两招:在向文件中写入内容后,如果不想马上关闭文件,也可以调用文件对象提供的flush() 方法,把缓冲区的内容写入文件,这样也能保证数据全部写入磁盘。

向文件中写入内容时,如果打开文件采用w(写入)模式,则先清空原文件中的内容,再写入新的内容;而如果打开文件采用a(追加)模式,则不覆盖原有文件的内容,只是在文件的结尾处增加新的内容。下面将对实例02的代码进行修改,实现在原动态信息的基础上再添加一条动态信息。修改后的代码如下:

print("\n","="*10,"蚂蚁庄园动态","="*10)
file = open('message.txt','a')              # 创建或打开保存蚂蚁庄园动态信息的文件
# 追加一条动态信息
file.write("牧牛人的小鸡在你的庄园待了22分钟。\n")
print("\n追加了一条动态……\n")
file.close ()               # 关闭文件对象

 

执行上面代码后,打开message.txt 文件。

多学两招:在Python中的文件对象中除了提供了write() 方法,还提供了writelines() 方法,可以实现把字符串列表写入文件,但是不添加换行符。

10.1.5 读取文件

在Python中打开文件后,除了可以向其写入或追加内容,还可以读取文件中的内容。读取文件内容主要分为以下几种情况:

1. 读取指定字符

文件对象提供了read() 方法读取指定个数的字符,语法格式如下:

file.read([size])

 

参数说明:

  • file:为打开的文件对象。
  • size:可选参数,用于指定要读取的字符个数,如果省略,则一次性读取所有内容。

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

例如,要读取message.txt 文件中的前3个字符,可以使用下面的代码:

with open('message.txt','r') as file:  # 打开文件
    string = file.read(3)              # 读取前3个字符
    print(string)

 

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

file.seek(offset[,whence])

 

参数说明:

  • file:表示已经打开的文件对象。
  • offset:用于指定移动的字符个数,其具体位置与whence 参数有关。
  • whence:用于指定从什么位置开始计算。值为0 表示从文件开头计算,值为1表示从当前位置开始计算,值为2 表示从文件尾开始计算,默认为0。

注意:对于whence参数,如果在打开文件时,没有使用b 模式(即rb),那么只允许从文件头开始计算相对位置,从文件尾计算时就会抛出异常。

例如,想要从文件的第19个字符开始读取13个字符可以使用下面的代码:

with open('message.txt','r') as file:   #  打开文件
    file.seek(19)                       # 移动文件指针到新的位置
    string = file.read(13)              # 读取前13个字符
    print(string)

 

如果采用GBK 编码的message.txt 文件内容为:

你使用了1张加速卡,小鸡撸起袖子开始双手吃饲料,进食速度大大加快。

 

那么执行上面的代码将显示以下结果:

小鸡撸起袖子开始双手吃饲料

 

说明:在使用seek() 方法时,如果采用GBK 编码,那么offset 的值是按一个汉字(包括中文标点符号)占两个字符计算,而采用UTF-8 编码,则一个汉字占3 个字符,不过无论采用何种编码英文和数字都是按一个字符计算的。这与read(size) 方法不同。

实例03:显示蚂蚁庄园的动态

print("\n","="*25,"蚂蚁庄园动态","="*25,"\n")
with open('message.txt','r') as file:             # 打开保存蚂蚁庄园动态信息的文件
    message = file.read()                         # 读取全部动态信息
    print(message)                                # 输出动态信息
    print("\n","="*29,"over","="*29,"\n")

 

2. 读取一行

在使用read() 方法读取文件时,如果文件很大,一次读取全部内容到内存,容易造成内存不足,所以通常会采用逐行读取。文件对象提供了readline() 方法用于每次读取一行数据。readline() 方法的基本语法格式如下:

file.readline()

 

其中,file 为打开的文件对象。同read() 方法一样,打开文件时,也需要制定打开模式为r(只读)或者r+(读写)。

实例04:逐行显示蚂蚁庄园的动态

 首先应用open()函数以只读方式打开一个文件,然后应用while语句创建循环,在该循环中调用readline()方法读取一条动态信息并输出,另外还需要判断内容是否已经读取完毕,如果读取完毕应用break语句跳出循环,代码如下:

print("\n","="*35,"蚂蚁庄园动态","="*35,"\n")
with open('message.txt','r') as file:       # 打开保存蚂蚁庄园动态信息的文件
    number = 0                              # 记录行号
    while True :
        number += 1
        line = file .readline()             # 读取一行
        if line =='':
            break                           # 跳出循环
        print(number,line,end="\n")         # 输出一行内容
print("\n","="*39,"over","="*39,"\n")

 

3. 读取全部行

读取全部行的作用同调用read() 方法时不指定size 类似,只不过读取全部行,返回的是一个字符串列表,每个元素为文件的一行内容。读取全部行,使用的是文件对象的readlines() 方法,其语法格式如下:

file.readlines()

 

其中,file为打开的文件对象。同read()方法一样,打开文件时,也需要指定打开模式为r(只读)或者r+(读写)。

例如,通过readlines()方法读取实例03中的message.txt文件,并输出读取结果,代码如下:

print("\n","="*25,"蚂蚁庄园动态","="*25,"\n")
with open('message.txt','r') as file:             # 打开保存蚂蚁庄园动态信息的文件
    message = file.readlines()                    # 读取全部动态信息
    print(message)                                # 输出动态信息
    print("\n","="*29,"over","="*29,"\n")

从该运行结果中可以看出readlines()方法的返回值为一个字符串列表。在这个字符串列表中,每个元素记录一行内容。如果文件比较大时,采用这种方法输出读取的文件内容会很慢。这是可以将列表的内容逐行输出。例如,下面的代码可以修改为以下内容。

print("\n","="*25,"蚂蚁庄园动态","="*25,"\n")
with open('message.txt','r') as file:             # 打开保存蚂蚁庄园动态信息的文件
    messageall = file.readlines()                    # 读取全部动态信息
    for message in messageall:
        print(message)                                # 输出动态信息
print("\n","="*29,"over","="*29,"\n")

 

10.2 目录操作

 目录也称文件夹,用于分层保存文件。通过目录可以分门别类地存放文件。我们也可以通过目录快速找到想要的文件。在Python中,并没有提供直接操作目录的函数或者对象,而是需要使用内置的os 和 os.path 模块实现。

说明:os 模块是Python内置的与操作系统功能和文件相关的模块。该模块中的语句的执行结果通常与操作系统有关,在不同操作系统上运行,可能回得到不一样的结果。

常用的目录操作主要有判断目录是否存在、创建目录、删除目录和遍历目录等,本节将详细介绍。

说明:本章的内容都是以Windows操作系统为例进行介绍的,所以代码的执行结果也都是在Windows操作系统下显示的。

10.2.1 os 和 os.path 模块

在Python 中,内置了os 模块及其子模块os.path 用于对目录或文件进行操作。在使用os 模块或者os.path 模块时,需要先应用import 语句将其导入,然后才可以应用它们提供的函数或者变量。

导入os 模块可以使用下面的代码:

import os

 

说明:导入os 模块后,也可以使用其子模块os.path。

导入os 模块后,可以使用该模块提供的通用变量获取与系统有关的信息。常用的变量有以下几个:

  • name:用于获取操作系统类型。

例如,在Windows操作系统下输出os.name。

说明:如果os.name的输出结果为nt,则表示是Windows操作系统;如果是posix,则表示是Linux、Unix或Mac OS操作系统。

  • linesep:用于获取当期操作系统上的换行符。

例如,在Windows操作系统下输出os.linesep。

  • sep:用于获取当前操作系统所使用的路径分隔符。

例如,在Windows操作系统下输出os.sep。

os 模块还提供了一些操作目录的函数。

os 模块是提供的与目录相关的函数
函数 说明
getcwd() 返回当前的工作目录
listdir(path) 返回指定路径下的文件和目录信息
mkdir(path[,mode]) 创建目录
makedirs(path1/paht2……[,mode]) 创建多级目录
rmdir(path) 删除目录
removedirs(path1/path2……) 删除多级目录
chdir(path) 把path设置为当前工作目录
walk(top[,topdown[,onerror]]) 遍历目录树,该方法返回一个元组,包括所有路径名、所有目录列表和文件列表3 个元素

os.path 模块也提供了一些操作目录的函数。

os.path 模块提供的与目录相关的函数
函数 说明
abspath(path) 用于获取文件或目录的绝对路径
exists(path) 用于判断目录或者文件是否存在,如果存在则返回True,否则返回False
join(paht,name) 将目录与目录或者文件名拼接起来
splitext() 分离文件名和扩展名
basename(path) 从一个目录中提取文件名
dirname(path) 从一个路径中提取文件路径,不包括文件名
isdir(path) 用于判断是否为有效路径

10.2.2 路径

用于定位一个文件或者目录的字符串被称为一个路径。在程序开发时,通常涉及两种路径,一种是相对路径,另一种是绝对路径。

1. 相对路径

在学习相对路径之前,需要先了解什么是当前工作目录。当前工作目录是指当前文件所在的目录。在Python中,可以通过os 模块提供的getcwd() 函数获取当前工作的目录。例如,在E:\program\Python\Code\demo.py 文件中,编写以下代码:

import os 
print(os.getcwd())        # 输出当前目录

 

执行上面的代码后

E:\program\Python\Code

相对路径就是依赖于当前工作目录的。如果在当前工作目录下,有一个名称为message.txt的文件,那么在打开这个文件时,就可以直接写上文件名,这是采用的就是相对路径,message.txt 文件的实际路径就是当前工作目录“E:\program\Python\Code”+相对路径“message.txt”,即“E:\program\Python\Code\message.txt”。

如果在当前工作目录下,有一个子目录demo,并且在孩子目录下保存着文件message.txt,那么在打开这个文件时就可以写上“demo/message.txt”,例如下面的代码:

with open("demo/message.txt") as file:        # 通过相对路径打开文件
    pass

 

说明:在Python中,指定文件路径时需要对路径分隔符“\”进行转义,即将路径中的“\”替换为“\\”,例如对于相对路径“demo\message.txt”需要使用““demo\\message.txt”代替。另外,也可以将路劲分隔符“\”采用“/”代替。

多学两招:在指定文件路径时,也可以在表示路径的字符串面前加上字母r(或R),那么该字符串将原样输出,这时路径中的分隔符就不需要再转义了。例如,上面的代码也可以修改为以下内容:

with open(r"demo/message.txt") as file:        # 通过相对路径打开文件
    pass

 

2. 绝对路径

绝对路径是指在使用文件时指定文件的实际路径。它不依赖于当前工作目录。在Python中,可以通过os.path模块提供的abspath()函数获取一个文件的绝对路径。abspath()函数的基本语法格式如下:

os.path.abspath(path)

 

其中,path为要获取绝对路径的相对路径,可以是文件也可以是目录。

例如,要获取相对路径”demo\message.txt”的绝对路径,可以使用下面的代码:

import os
print(os.path.abspath(r"demo\message.txt"))    # 获取绝对路径

 

如果当前工作目录为“E:\program\Python\Code\”,那么将得到以下结果:

E:\program\Python\Code\demo\message.txt

 

3. 拼接路径

如果想要将两个或者多个路径拼接到一起组成一个新的路径,可以使用os.path模块提供的join()函数实现。join()函数基本语法格式如下:

os.path.join(path1[,path2[,......]])

 

其中,path1、path2用于代表要拼接的文件路径,这些路径间使用逗号进行分隔。如果在要拼接的路径中,没有一个绝对路径,那么最后拼接出来的将是一个相对路径。

注意:使用os.path.join()函数拼接路径时,并不会检测该路径是否真实存在。

例如,需要将“E:\program\Python\Code\”和“demo\message.txt”路径拼接到一起,可以使用下面的代码。

import os
print(os.path.join("E:\program\Python\Code\","demo\message.txt"))  # 拼接字符串

 

执行上面的代码。 

E:\program\Python\Code\demo\message.txt

 

说明: 

 在使用join()函数时,如果要拼接的路径中,存在多个绝对路径,那么以从左到右为序最后一次出现的路径为准,并且该路径之前的参数都将被忽略。例如,执行下面的代码:

import os
print(os.path.join("E:\\code","E:\\python\\mr","Code","C:\\","demo"))    # 拼接字符串

 

将得到拼接后的路径为“C:\demo”。

注意:把两个路径拼接为一个路径时,不要直接使用字符串拼接,而是使用os.path.join()函数,这样可以正确处理不同操作系统的路径分隔符。

10.2.3 判断目录是否存在

在Python中,有时需要判断给定的目录是否存在,这时可以使用os.path模块 提供的exists()函数实现。exists()函数的基本语法格式如下:

os.path.exists(path)

 

其中,path为要判断的目录,可以采用绝对路径,也可以采用相对路径。

返回值:如果给定的路径存在,则返回True,否则返回False。

例如,要判断绝对路径“C:\demo”是否存在,可以使用下面的代码:

import os
print(os.path.exists("C:\\demo"))            # 判断目录是否存在

 

执行上面的代码,如果在C盘根目录下没有demo子目录,则返回False,否则返回True。

……

10.2.4 创建目录

在Python中,os模块提供了两个创建目录的函数,一个用于创建一级目录,另一个用于创建多级目录。

1. 创建一级目录

创建一级目录是指一次只能创建一级目录。在Python中,可以使用os模块提供的mkdir()函数实现。通过函数只能创建指定路径中的最后一级目录,如果该目录的上一级不存在,则抛出FileNotFoundError异常。

os.mkdir(path,mode=0o777)

 

参数说明:

  • path:用于指定要创建的目录,可以使用绝对路径,也可以使用相对路径。
  • mode:用于指定数值模式,默认值为0777。该参数在非UNIX系统上无效或被忽略。

例如,在Windows系统上创建一个C:\demo目录,可以使用下面的代码:

import os
os.mkdir("C:\\demo")    # 创建C:\demo目录

 

执行代码后,将在C盘根目录下创建一个demo目录。

如果在创建路径时已经存在将抛出FileNotFoundError异常。

要解决上面的问题,可以在创建目录前,先判断指定的目录是否存在,只有当目录不存在时才创建。具体代码如下:

import os
path = "C:\\demo"                   # 指定要创建的目录
if not os.path.exists(path):        # 判断目录是否存在
    os.mkdir(path)                  # 创建目录
    print("目录创建成功!")
else:
    print("该目录已经存在!")

 

执行上面的代码,将显示“该目录已经存在!”。

注意:如果指定的目录有多级,而且最后一级的上级目录中有不存在的,则抛出FileNotFoundError异常,并且目录创建不成功。要解决该问题有两种方法,一种是使用创建多级目录的方法(将在后面进行介绍)。另一种是编写递归函数调用os.mkdir()函数实现,具体代码如下:

import os                             # 导入标模块os
def mkdir(path):                      # 定义递归创建目录的函数
    if not os.path.isdir(path):       # 判断是否为有效路径
        mkdir(os.path.split(path)[0]) # 递归调用
    else:                             # 如果目录存在,直接返回
        return
    os.mkdir(path)                    # 创建目录
mkdir("D:/mr/test/demo")              # 调用mkdir递归函数

 

2. 创建多级目录

使用mkdir()函数只能创建一级目录,如果想创建多级目录,可以使用os模块提供的makedirs()函数,该函数用于采用递归的方式创建目录。makedirs()函数的基本语法格式如下:

os.makedirs(name,mode=0o777)

 

参数说明:

  • name:用于指定要创建的目录,可以使用绝对路径,也可以使用相对路径。
  • mode:用于指定数值模式,默认值为0777。该参数在非UNIX系统上无效或被忽略。

例如,在Windows系统上,刚刚创建的C:\demo目录下,再创建子目录test\dir\mr(对应的目录为:C:\demo\test\dir\mr),可以使用下面的代码。

import os
os.makedirs("C:\\demo\\test\\dir\\mr")         # 创建C:\demo\test\dir\mr目录

 

……

10.2.5 删除目录

删除目录可以使用通过使用os模块提供的rmdir()函数实现。通过rmdir()函数删除目录时,只有当要删除的目录为空时才起作用。rmdir()函数的基本语法格式如下:

os.rmdir(path)

 

其中,path为要删除的目录,可以使用相对路径,也可以使用绝对路径。

例如,要删除刚刚创建的“C:\demo\test\dir\mr”目录,可以使用下面的代码:

import os
os.rmdir("C:\\demo\\test\\dir\\mr")         # 创建C:\demo\test\dir\mr目录

 

执行上面的代码后,将删除“C:\demo\test\dir”目录下的mr目录。

注意:如果要删除的目录不存在,那么将抛出“FileNotFoundError:[WinError2]系统找不到指定的文件”异常。因此,在执行os.rmdir()函数前,建议先判断该路径是否存在,可以使用os.path.exists()函数判断。具代码如下:

import os
path = "C:\\demo\\test\\dir\\mr"            # 指定要创建的目录
if os.path.exists(path):                    # 判断目录是否存在
    os.rmdir("C:\\demo\\test\\dir\\mr")     # 删除目录
    print("目录删除成功!")
else:
    print("该目录不存在!")

 

多学两招:使用rmdir()函数只能删除空的目录,如果想要删除非空目录,则需要使用Python内置的标准模块shutil 的rmtree() 函数实现。例如,要删除不为空的“C:\\demo\\test”目录,可以使用下面的代码:

import shutil
shutil.rmtree("C:\\demo\\test")             # 删除C:\demo目录下的test子目录及其内容

 

10.2.6 遍历目录

遍历在汉语中的意思是全部走遍,到处周游。在Python中,遍历是将指定的目录下的全部目录(包括子目录)及文件访问一遍。在Python中,os模块的walk()函数用于实现遍历目录的功能。walk()函数的基本语法格式如下:

os.walk(top[,topdown][,onerror][,followlinks])

 

参数说明:

  • top:用于指定要遍历内容的根目录。
  • topdown:可选参数,用于指定遍历的顺序,如果值为True,表示自上而下遍历(即先遍历根目录);如果值为False,表示自下而上遍历(即先遍历最后一级子目录)。默认值为True。
  • onerror:可选参数,用于指定错误处理方式,默认为忽略,如果不想忽略也可以指定一个错误处理函数。通常情况下采用默认设置。
  • followlinks:可选参数,默认情况下,walk()函数不会向下转换成解析到目录的符号链接,将该参数值设置为True,表示用于指定在支持的系统上访问由符号链接指向的目录。
  • 返回值:返回一个包括3个元素(dirpath,dirnames,filenames)的元组生成器对象。其中,dirpath表示当前遍历的路径,是一个字符串;dirnames表示当前路径下包含的子目录,是一个列表;filenames表示当前路径下包含的文件,也是一个列表。

例如,要遍历指定目录“E:\program\Python\Code\01”,可以使用下面的代码:

import os                                       # 导入os模块
tuples = os.walk("E:\program\Python\Code\01")   # 遍历“E:\program\Python\Code\01”目录
for tuple1 in tuples:                           # 通过for循环输出遍历结果
    print(tuple1,"\n")                          # 输出每一级目录的元组

 

……

注意:walk()函数只在Unix系统和Windows系统中有效。

实例05:遍历指定目录

……

10.3 高级文件操作

……

 

posted @ 2019-03-27 22:23  牧牛人Alec  阅读(673)  评论(0编辑  收藏  举报