os模块对文件夹和文件的操作很多。可以先看:
Python os模块文件操作(一)
一、os文件夹删除操作
代码语言:javascript复制# coding=utf-8
import os
try:
os.mkdir("folder")
except:
pass
fd = os.open('folder/ccc.txt', os.O_CREAT)
print(os.listdir('folder'))
os.close(fd)
try:
# 删除指定的空目录,如果目录非空,则抛出一个OSError异常
os.rmdir("folder")
except OSError as e:
print(e)
os.remove('folder/ccc.txt')
print(os.listdir('folder'))
try:
os.rmdir("folder")
print("删除文件夹成功")
except OSError as e:
print(e)
运行结果:
代码语言:javascript复制['ccc.txt']
[Errno 39] Directory not empty: 'folder'
[]
删除文件夹成功
上面的代码中,先创建了一个folder文件夹,然后在folder目录下创建了一个ccc.txt文件,使用os.listdir()方法,看到文件夹中有一个ccc.txt文件,说明我们创建文件夹和文件都成功了。
os.rmdir(name)是删除指定的文件夹,如果删除的文件夹不是一个空的文件夹,会报错,抛出OSError异常,如上面的folder中有ccc.txt文件时,删除时报错了。先将ccc.txt文件删除,再使用rmdir()来删除folder文件夹,删除成功。
二、os递归创建、重命名、删除文件夹
代码语言:javascript复制try:
# 递归创建文件夹
os.makedirs("folder_a/folder_aa/folder_aaa")
except:
pass
os.makedirs(path)会根据传入的路径递归地创建文件夹。如:上面的代码执行后,会在当前目录下递归地创建folder_a/folder_aa/folder_aaa文件夹,文件夹是分三层的。
在传入path时,最后也可以是一个文件,这样会先递归创建目录,然后在最里层创建文件。
代码语言:javascript复制try:
# 递归地对目录进行更名,也可以对文件进行更名
os.renames("folder_a/folder_aa/folder_aaa", "folder_b/folder_bb/folder_bbb")
except:
pass
os.renames(old, new)会根据传入的old和new参数,递归地对文件夹进行重命名,将old的文件夹名重命名成new的文件夹名。
如果old的文件夹除了最里面的文件夹外,其他都是空的,则重命名后old改成了new。old和new的层数可以不同,如old是3层的目录,new可以不等于3层,最终,old最里层的文件保留在new最里层的文件夹里。
如果在old除了最里层目录内有文件,其他层里也有文件,renames()按照new创建新的嵌套文件夹,将old最里层的文件复制过来,old里有文件的文件夹及父级文件夹保留不变。具体可以自己演示一下,就知道效果了。
代码语言:javascript复制try:
# 递归删除目录
os.removedirs("folder_b/folder_bb/folder_bbb")
except:
pass
os.removedirs(path)会递归地将文件夹删除。path的最里层可以指定到文件(如果有文件的话)。
当递归删除的文件夹中有文件时,如果path没有指定到文件,只指定到文件夹,删除会失败,文件夹里面为空才能删除成功。
如果除了最里层目录有文件,其他层目录里也有文件,文件及文件的父级目录都会保留。
三、os获取当前文件夹的信息
代码语言:javascript复制# os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]])
folders = os.walk('.')
for i in folders:
print(i)
运行结果:
代码语言:javascript复制('.', ['os_folder'], ['os_demo_two.py', 'os_demo.py'])
('./os_folder', [], ['aaa.txt'])
os.walk(path)返回指定目录下的文件信息,返回的是一个可迭代对象。os.walk()会遍历指定目录下的所有文件夹,依次返回每个文件夹中的文件信息。
上面的代码中,传入的参数是当前路径,遍历返回的可迭代对象,得到的文件信息是一个一个的元组。
每个元组的第一个元素是文件夹的相对路径,根据我们传的参数来确定。第二个元素是此文件夹下有哪些子文件夹,这些子文件夹的名字组成一个列表,如果没有子文件夹,则列表为空。第三个元素是此文件夹下有哪些文件,这些文件的文件名组成一个列表,如果没有文件,则列表为空。
os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]])的参数:
top为指定的目录或路径,是一个文件夹。
topdown可选,为True或者没有指定, 则返回结果是从最上层目录开始遍历的,如果指定为False,则从最底层目录开始遍历。
onerror可选,是一个函数,它调用时有一个参数, 一个OSError实例。报这个错误后,继续执行walk,或者抛出exception终止walk。
followlinks可选,设置为true,则通过软链接访问目录。
代码语言:javascript复制# 获取path指定的路径的信息
print(os.stat(os.getcwd()))
# 像stat(),但是没有软链接
print(os.lstat(os.getcwd()))
运行结果:
代码语言:javascript复制os.stat_result(st_mode=16893, st_ino=656043, st_dev=2049, st_nlink=3, st_uid=1000, st_gid=1000, st_size=4096, st_atime=1565531003, st_mtime=1565531428, st_ctime=1565531428)
os.stat_result(st_mode=16893, st_ino=656043, st_dev=2049, st_nlink=3, st_uid=1000, st_gid=1000, st_size=4096, st_atime=1565531003, st_mtime=1565531428, st_ctime=1565531428)
os.stat(path)返回指定路径的信息,详见上面的运行结果。其中比较常用的有st_size和st_mtime。
每一项的含义如下:
st_mode: inode 保护模式
st_ino: inode 节点号
st_dev: inode 驻留的设备
st_nlink: inode 的链接数
st_uid: 所有者的用户ID
st_gid: 所有者的组ID
st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据
st_atime: 上次访问的时间
st_mtime: 最后一次修改的时间
st_ctime: 由操作系统报告的"ctime"。
四、os修改文件的权限
代码语言:javascript复制# 检验文件的权限
print(os.access('os_folder/aaa.txt', os.F_OK))
print(os.access('os_folder/aaa.txt', os.R_OK))
print(os.access('os_folder/aaa.txt', os.W_OK))
print(os.access('os_folder/aaa.txt', os.X_OK))
import stat
# 修改文件的权限
os.chmod('os_folder/aaa.txt', stat.S_IRUSR)
print(os.access('os_folder/aaa.txt', os.X_OK))
print(os.access('os_folder/aaa.txt', os.W_OK))
os.chmod('os_folder/aaa.txt', stat.S_IRWXU)
运行结果:
代码语言:javascript复制True
True
True
True
False
False
os.access(file, mode)用于判断文件是否存在,是否可读,是否可写,是否可执行。
os.chmod(file, mode)用于修改文件的权限。
上面的代码中,通过os.access()依次判断了aaa.txt文件是否存在,是否可读,可写,可执行,一开始都是Ture,然后通过os.chmod()修改为只读,aaa.txt的可写和可执行变成False。
os.access()的mode常用参数:
os.F_OK: 作为access()的mode参数,判断path是否存在
os.R_OK: 包含在access()的mode参数中 , 判断path是否可读
os.W_OK: 包含在access()的mode参数中 , 判断path是否可写
os.X_OK: 包含在access()的mode参数中 ,判断path是否可执行
os.chmod()的mode常用参数:
stat.S_IXOTH: 其他用户有执行权限
stat.S_IWOTH: 其他用户有写权限
stat.S_IROTH: 其他用户有读权限
stat.S_IRWXO: 其他用户有全部权限
stat.S_IXGRP: 组用户有执行权限
stat.S_IWGRP: 组用户有写权限
stat.S_IRGRP: 组用户有读权限
stat.S_IRWXG: 组用户有全部权限
stat.S_IXUSR: 拥有者具有执行权限
stat.S_IWUSR: 拥有者具有写权限
stat.S_IRUSR: 拥有者具有读权限
stat.S_IRWXU: 拥有者有全部权限