第10章 文件及目录操作
10.2 目录操作
目录操作:创建、遍历、删除、拷贝、路径、判断
1、os模块
# 获取当前操作系统类型
import os
t = os.name
print(t)
output:
nt
# 获取当前操作系统路径分隔符
import os
t = os.sep
print(t)
output:
2、路径
定义:用于定位一个文件或目录的字符串被称为一个路径,分为绝对路径和相对路径
- 相对路径
当前工作目录:是指当前文件所在的目录,可用getcwd()函数获取。
# 获取当前的工作目录
import os
t = os.getcwd()
print(t)
output:
D: 1Pythonpythonbasic
在表示路径的字符串前面加上字母r,那么该字符将原样输出
- 绝对路径
绝对路径是指在使用文件时指定文件的实际路径,它不依赖于当前目录。可以用abspath()函数获取一个文件的绝对路径
# 绝对路径用os.path.abspath(path)
import os
t = os.path.abspath("work1.txt")
print(t)
output:
D: 1Pythonpythonbasicwork1.txt
- 拼接路径
将两个或多个路径拼接在一起,可使用os.path模块提供的join()函数
# 拼接路径用os.path.join(path1[,path2[,......]])
3、判断文件或目录是否存在
# 判断文件是否存在用os.path.exists(path)
import os
t = os.path.exists("work1.txt")
print(t)
output:
True
4、创建目录
os.mkdir(path,mode=0o777) # 创建一级目录
# 递归的创建目录
import os
os.makedirs('tmp/python/fileop',exist_ok=True)
会在当前工作目录下面创建 tmp目录,在tmp目录下面再创建 python目录,在Python目录下面再创建fileop目录
exist_ok=True
指定了,如果某个要创建的目录已经存在,也不报错
5、删除目录
os.rmdir(path) # 只能删除空目录
import shutil
shutil.rmtree("C:\demo\test") # 递归删除目录,删除非空目录
shutil.rmtree() 可以递归的删除某个目录所有的子目录和子文件
import shutil
shutil.rmtree('tmp')
# 递归删除某一目录下的子目录及文件用rmtree方法
import shutil
filename = r"D: 1Pythonpythonbasicwork1"
if os.path.exists(filename) == True:
shutil.rmtree(filename)
if os.path.exists(filename) == False:
print("目录存在,已被删除!")
else:
print("目录不存在,未执行删除操作!")
显示目录
列出某一目录下所有文件和目录
# 显示目录用os.listdir("路径"),类似于dir
import os
t = os.listdir(r"d: 1pythonpythonbasic")
print(t)
output:
['class.py', 'dict.py', 'file.py', 'func.py', 'keywordlist.py', 'list.py', 'r1.txt', 'string1.py', 'sum1-100.py', 'traversal_strings.py', 'while.py', 'with_as.py', 'work1.txt', '__init__.py', '测试工匠麻辣烫博客.png']
6、遍历目录
os模块的walk()函数用于遍历目录
os.walk(top[,topdown][,onerror][,followlinks])
import os
path = "C:\demo"
print("【",path,"】目录下包括的文件和目录")
for root, dirs, files in os.walk(path, topdown=True):
for name in dirs:
print(".",os.path.join(root,name))
for name in files:
print("。",os.path.join(root,name))
7、拷贝目录
如果我们要拷贝一个目录里面所有的内容(包括子目录和文件、子目录里面的子目录和文件,等等)到另外一个目录中,可以使用 shutil的copytree函数。
如下所示
from shutil import copytree
# 拷贝 d:/tools/aaa 目录中所有的内容 到 e:/bbb 中
copytree('d:/tools/aaa', 'e:/new/bbb')
注意拷贝前, 目标目录必须 不存在
,否则会报错。
上面的代码执行前面,如果 e:/new/bbb 已经存在,执行到copytree时,就会报错
上面的代码执行前面,如果 e:/new 这个目录都不存在,执行到copytree时,就会 创建 e:/new 目录,再创建 e:/new/bbb 目录,再拷贝 d:/tools/aaa 目录中所有的内容 到 e:/new/bbb 中。
上面的代码执行前面,如果 e:/new 这个目录存在,但是 e:/new/bbb 不存在,执行到copytree时,就只会 创建 e:/new/bbb ,再拷贝 d:/tools/aaa 目录中所有的内容 到 e:/new/bbb 中。
高级操作
判断一个名字是目录还是文件
# 判断一个名字是目录还是文件
os.path.isdir("名称")判断是不是目录
os.path.isfile("名称")判断是不是文件
import os
t = os.path.isdir(r"d: 1pythonpythonbasic")
print(t)
f = os.path.isfile(r"d: 1pythonpythonbasicwork1.txt")
print(f)
output:
True
True
修改文件名、目录名用os.rename()
# 修改文件名、目录名用os.rename()
import os
# 修改目录名 d:/tools/aaa 为 d:/tools/bbb
os.rename('d:/tools/aaa','d:/tools/bbb')
# 修改文件名 d:/tools/first.py 为 d:/tools/second.py
os.rename('d:/tools/first.py','d:/tools/second.py')
对路径的操作
# 对于文件名的操作,比如 获取文件名称,文件所在目录,文件路径的拼接等,都可以使用 os.path 模块。
import os
p = r"d: 1pythonpythonbasicwork1.txt"
t = os.path.basename(p) # 取文件名
print(t)
f = os.path.dirname(p) # 取目录
print(f)
j = os.path.join(t, f, os.path.basename(p)) # 拼接
print(j)
output:
work1.txt
d: 1pythonpythonbasic
d: 1pythonpythonbasicwork1.txt
判断文件、目录是否存在
# 判断一个指定路径的文件或目录是否存在用exists()
import os
os.path.exists('d:/systems/cmd.exe')
os.path.exists('d:/systems')
获取文件的大小和日期
import time
getsize = os.path.getsize(r"d: 1pythonpythonbasicwork1.txt")
getmtime = time.ctime(os.path.getmtime(r"d: 1pythonpythonbasicwork1.txt"))
print(getsize)
print(getmtime)
output:
88
Fri Jul 24 11:34:29 2020
递归的遍历目录下面所有的文件
假如我们要获取某个目录中所有的 文件, 包括子目录里面的文件。 可以使用 os库中的walk方法
比如我们要得到某个目录下面所有的子目录 和所有的文件,存放在两个列表中
可以这样写代码
import os
# 目标目录
targetDir = r'd: mputildistcheck'
files = []
dirs = []
# 下面的三个变量 dirpath, dirnames, filenames
# dirpath 代表当前遍历到的目录名
# dirnames 是列表对象,存放当前dirpath中的所有子目录名
# filenames 是列表对象,存放当前dirpath中的所有文件名
for (dirpath, dirnames, filenames) in os.walk(targetDir):
files += filenames
dirs += dirnames
print(fles)
print(dirs)
如果我们只需要获取目录中所有的文件,或者只需要子目录,可以这样
import os
from os.path import isfile, join,isdir
# 目标目录
targetDir = r'd: mputildistcheck'
# 所有的文件
print([f for f in os.listdir(targetDir) if isfile(join(targetDir, f))])
# 所有的目录
print([f for f in os.listdir(targetDir) if isdir(join(targetDir, f))])
得到目录中指定扩展名的文件和子目录
# 可以使用glob库
import glob
exes = glob.glob(r'd: mp*.txt')
print(exes)