三、文件和目录的删除
若要删除单个文件的话,可以使用os.remove函数,例如:os.remove(’mydata.dat’)。Os.remove的别名是os.unlink,不过后者跟传统的UNIX操作系统以及Perl中清除文件的函数重名。我们可以使用下列方式来删除一组文件,如所有以.jpg以及*.gif为扩展名的文件:
for file in glob.glob(’*.jpg’) + glob.glob(’*.gif’):
os.remove(file)
os.remove(file)
大家知道,只有当目录中内容已经被清空的时候,我们才可以使用rmdir命令来删除该目录。不过,我们经常想要删除一个含有许多文件的目录树,这时我们可以使用shutil模块提供的rmtree函数,如下所示:
shutil.rmtree(’mydir’)
它相当于UNIX操作系统中的命令rm -rf mydir。
我们可以建立一个自定义函数,使其在进行删除操作的时候将文件和目录做同等对待,其典型用法如下所示:
remove(’my.dat’) #删除当个文件my.dat
remove(’mytree’) #删除单个目录树 mytree
# 通过字符串列表中的名称来删除多个文件/目录树:
remove(glob.glob(’*.tmp’) + glob.glob(’*.temp’))
remove([’my.dat’,’mydir’,’yourdir’] + glob.glob(’*.data’))
remove(’mytree’) #删除单个目录树 mytree
# 通过字符串列表中的名称来删除多个文件/目录树:
remove(glob.glob(’*.tmp’) + glob.glob(’*.temp’))
remove([’my.dat’,’mydir’,’yourdir’] + glob.glob(’*.data’))
下面是remove函数的实现:
def remove(files):
"""删除一个或多个文件和/或目录。"""
if isinstance(files, str): # files是个字符串吗?
files = [files] # 把files从字符串转为列表
if not isinstance(files, list): # files不是列表吗?
<report error>
for file in files:
if os.path.isdir(file):
shutil.rmtree(file)
elif os.path.isfile(file):
os.remove(file)
"""删除一个或多个文件和/或目录。"""
if isinstance(files, str): # files是个字符串吗?
files = [files] # 把files从字符串转为列表
if not isinstance(files, list): # files不是列表吗?
<report error>
for file in files:
if os.path.isdir(file):
shutil.rmtree(file)
elif os.path.isfile(file):
os.remove(file)
下面测试一下remove函数的灵活性:
# 建立10个目录tmp_* ,以及10各文件tmp__*:
for i in range(10):
os.mkdir(’tmp_’+str(i))
f = open(’tmp__’+str(i), ’w’); f.close()
remove(’tmp_1’) # tmp_1为目录
remove(glob.glob(’tmp_[0-9]’) + glob.glob(’tmp__[0-9]’))
作为上述remove函数实现的一个注记,我们进行了下列测试:
if not isinstance(files, list):
for i in range(10):
os.mkdir(’tmp_’+str(i))
f = open(’tmp__’+str(i), ’w’); f.close()
remove(’tmp_1’) # tmp_1为目录
remove(glob.glob(’tmp_[0-9]’) + glob.glob(’tmp__[0-9]’))
作为上述remove函数实现的一个注记,我们进行了下列测试:
if not isinstance(files, list):
它实际上是过于严厉。我们需要的只是一个被遍历的一个文件/目录名序列。实际上,我们并不关心名称是否存储在一个列表、元组或者数值数组中,所以更好的测试应该像下面这样:
if not operator.isSequenceType(files):
<report error>
<report error>