四、os模块
主要用于文件夹处理
(一)文件夹相关
os.makedirs(‘dirname1/dirname2’) :创建文件夹目录,不能重复创建,用的多
代码:
os.makedirs('a/b/c')
结果:
os.removedirs(‘dirname1’):删除文件夹,目录必须是空的,不空会报错。彻底删除,不会留在回收站,一定要小心误删。
os.mkdir(‘dirname’):生成单级目录,用得少,不如前面的好用
os.mkdir(‘a/b/c’):在a/b中创建c,如果a/b没有,就会报错
os.rmdir(‘a/b/c’):在a/b中删去c,只删一层
实际应用中一般不删除文件夹
(二)文件相关
os.listdir:列出文件名
代码:
name = os.listdir('a')
print(name)
结果:
['1.txt', '2.txt', 'b']
坑:只能拿到当前一层,下一层是拿不到的
os.remove(‘a/2.txt’):删除一个文件
open(“a/2.txt”,mode=“w”):创建文件
os.rename(‘old’,‘new’):文件重命名
os.getcwd():获取当前python脚本工作的目录路径,相当于./
代码:
print(os.getcwd())
结果:
D:\PycharmProjects\樵夫老师Python零基础课程\4_模块
os.chdir(“dirname”):改变当前脚本工作目录,相当于cd
os.chdir('./a')
print(os.getcwd())
特殊情况下会用,方便在某个文件夹内进行文件操作,一般不用
os.system(“bash command”):运行shell命令
os.system(“dir”):调用命令,会出乱码,可以执行一条命令
os.popen(“dir”):调用命令,不乱码,可以执行一条命令
(三)路径相关
os.path.exists():判断一个路径是否存在
print(os.path.exists('a/b/3.txt'))
既能判断文件,也能判断文件夹
os.isdir(“a/b”):判断是否为文件夹
print(os.path.isdir("a/b"))
比exists判断的更精细,如果不存在,那么会得到False
os.path.isfile(“a/b”):判断是否为文件
print(os.path.isfile("a/b"))
os.path.abspath(“a/b”):得到a/b的绝对路径
os.path.split():切割路径为文件夹和文件
代码:
print(os.path.split(os.path.abspath("a/b/2.txt")))
结果:
('D:\\PycharmProjects\\樵夫老师Python零基础课程\\4_模块\\a\\b', '2.txt')
前面是文件夹,后面是文件
os.path.dirname():得到绝对路径中的文件夹
代码:
print(os.path.dirname(os.path.abspath("a/b/2.txt")))
结果:
D:\PycharmProjects\樵夫老师Python零基础课程\4_模块\a\b
os.path.basename():得到绝对路径中的文件
代码:
print(os.path.basename(os.path.abspath("a/b/2.txt")))
结果:
2.txt
os.path.join():拼接路径,自动使用不同系统的相应文件系统分隔符来拼接
代码:
r = os.path.join('a/b','c','d.txt')
print(r)
结果:
a/b\c\d.txt
os.path.getsize():获取文件大小
代码:
r = os.path.getsize('a/哈哈哈.txt')
print(r)
结果:
17
结果表示文件的字节数
(四)扩展:遍历文件夹中的内容
代码:
path = "a"
for name in os.listdir(path): # 得到a里面所有的文件名
# 需要拼接路径
new_path = os.path.join(path, name)
if os.path.isdir(new_path):
print('文件夹',name)
else:
print("普通文件",name)
结果:
普通文件 1.txt
普通文件 2.txt
文件夹 b
文件夹 c
文件夹 d
普通文件 哈哈哈.txt
如果是文件夹,那么这个代码应该重新执行一次,但没办法确定到底要套多少层
把这段代码写成函数就能处理了
代码:
def func(path):
for name in os.listdir(path):
new_path = os.path.join(path, name)
if os.path.isdir(new_path):
print('文件夹', name)
func(new_path) # 递归循环,不需要确定循环层数,直到不存在文件夹为止
else:
print("普通文件", name)
func("a")
结果:
普通文件 1.txt
普通文件 2.txt
文件夹 b
普通文件 3.txt
文件夹 f
普通文件 ffff.txt
文件夹 c
文件夹 d
普通文件 222.txt
普通文件 333.txt
普通文件 哈哈哈.txt
结果看不出结构,加入缩进
代码:
def func(path,ceng):
for name in os.listdir(path):
new_path = os.path.join(path, name)
if os.path.isdir(new_path):
print(ceng*'\t','文件夹', name)
func(new_path,ceng+1) # 递归循环,不需要确定循环层数,直到不存在文件夹为止
else:
print(ceng*'\t',"普通文件", name)
func("a",1)
结果:
普通文件 1.txt
普通文件 2.txt
文件夹 b
普通文件 3.txt
文件夹 f
普通文件 ffff.txt
文件夹 c
文件夹 d
普通文件 222.txt
普通文件 333.txt
普通文件 哈哈哈.txt
也可以用os.walk进行遍历,直接遍历文件夹中所有内容
(五)创建文件的正确流程
def creat_file(path, gai):
# 先处理路径
dirname = os.path.dirname(path)
if not os.path.exists(dirname):
os.makedirs(dirname)
# 到此文件夹没问题了,然后考虑文件
if os.path.exists(path):
if gai:
open(path, 'w').close()
else:
return # 文件已经存在,并且用户选择不覆盖
else:
open(path, 'w').close() # 创建文件
creat_file("张三丰/金花婆婆/呵呵.txt",True)