你好,我是悦创。
在日常工作中,我们经常会和文件、文件夹打交道,比如将服务器上指定目录下文件进行归档,或将爬虫爬取的数据根据时间创建对应的文件夹 / 文件,如果这些还依靠手动来进行操作,无疑是费时费力的,这时候 Python 中的 os 模块就必不可少了。本小节将围绕 os 模块的使用进行介绍。
1. os 模块介绍
os 模块是 Python 中的内置模块,无需安装即可使用,os 模块提供非常丰富的方法用来处理文件和目录。
os 模块的使用步骤如下。
步骤 1:导入 os 模块
import os
步骤 2:操作文件或者文件夹
通过 os 模块提供的方法对文件、文件夹进行操作。
2. os 模块操作文件与文件夹
os 模块是 Python 中操作文件与文件夹时常用的模块,os 模块中常用方法见下表。
方法名 | 描述 |
getcwd() | 获取当前工作目录 |
listdir(path) | 获取指定的文件夹包含的文件或文件夹的名字的列表 |
rename(src,dst) | 用于文件或文件夹重命名 |
makedirs(path) | 用于递归创建文件夹 |
removedirs(path) | 用于递归删除文件夹 |
remove(path) | 删除指定路径的文件 |
open(file, flags[, mode]) | 打开文件 |
read(fd,n) | 读取指定文件 |
wirte(fd,str) | 写入内容 |
walk(dir) | 文件、目录遍历器 |
os.path 模块中常用方法见下表。
方法名 | 描述 |
os.path.exists(path) | 如果路径 path 存在,返回 True;如果路径 path 不存在,返回 False |
os.path.join(path1[, path2[, …]]) | 把目录和文件名合成一个路径 |
下面来具体看下每个方法的使用:
1. getcwd() 使用:
import os
print(os.getcwd()) #输出:D:\code
代码解释: 当前代码文件存放在 D:\code
下,导入 OS 模块,使用 getcwd()
方法,获取当前工作目录,打印结果为 D:\code
,如下图所示。
2. listdir() 使用:
import os
print(os.listdir('.'))
# 输出:['dingding.py', 'image', 'index.py', 'writeppt.py', 'writeword.py']
代码解释: listdir()
方法可以 获取指定的文件夹包含的文件或文件夹的名字的列表 ,目前 D:\code
目录下文件结构如下图所示。
通过 listdir()
方法传递指定目录,代码中传递 “.
” 表示当前目录,输出结果:['dingding.py', 'image', 'index.py', 'writeppt.py', 'writeword.py']
,如下图所示。
3. rename() 使用:
import os
os.rename("image", "newimage")
os.rename("dingding.py", "newdingding.py")
代码解释 : rename()
方法为重命名文件或文件夹,第一个参数为要重命名的文件名或文件夹名,第二个参数为修改后的名称,上述代码中将文件夹 image
重名为 newimage
,将文件 dingding.py
重名为 newdingding.py
,代码执行完成后,D:\code
目录下效果如下图所示。
4. makedirs() 使用:
import os
os.makedirs("dist/src/code")
代码解释: makedirs()
方法用于递归创建目录,参数即为需要递归创建的目录,上述代码指定 dist/src/code
,即表示创建一个 dist
文件夹,其中包含 src
文件夹,在 src
下包含 code 文件夹。代码执行完成后,D:\code
目录下效果如下图所示。
5. removedirs() 使用:
import os
os.removedirs("dist/src/code")
print(os.listdir('.'))
# 输出:['newdingding.py', 'newimage', 'index.py', 'writeppt.py', 'writeword.py']
代码解释 : removedirs()
方法用于递归删除目录,参数为要递归删除的目录,上述代码指定 dist/src/code
,即将 dist
文件夹下 src
文件夹下 code
文件夹一并进行删除。
执行完删除后,通过 listdir()
方法查看当前目录下文件结构,输出 ['newdingding.py', 'newimage', 'index.py', 'writeppt.py', 'writeword.py']
,可以看到已经完成删除操作。
6. remove() 使用:
import os
os.remove("newdingding.py")
print(os.listdir('.'))
# 输出:['newimage', 'index.py', 'writeppt.py', 'writeword.py']
代码解释 : remove()
方法用于删除指定文件,上述代码中删除 newdingding.py
文件,删除完成后,通过 listdir ()
方法查看当前目录文件结构,输出 ['newimage', 'index.py', 'writeppt.py', 'writeword.py']
,可以看到已经完成删除操作。代码执行完成后,D:\code
目录下效果如下图所示。
7. open() 使用:
import os
os.open("writeppt.py", os.O_RDONLY)
代码解释: open()
方法用于打开指定文件,第一个参数为要打开的文件,第二个参数为打开的模式,可以取值如下所示:
- OS.O_RDONLY:以只读的方式打开;
- OS.O_WRONLY:以只写的方式打开;
- OS.O_RDWR:以读写的方式打开;
- OS.O_NONBLOCK:打开时不阻塞;
- OS.O_APPEND:以追加的方式打开;
- OS.O_CREAT:创建并打开一个新文件;
- OS.O_TRUNC:打开一个文件并截断它的长度为零(必须有写权限);
- OS.O_EXCL:如果指定的文件存在,返回错误;
- OS.O_SHLOCK:自动获取共享锁;
- OS.O_EXLOCK:自动获取独立锁;
- OS.O_DIRECT:消除或减少缓存效果;
- OS.O_FSYNC:同步写入;
- OS.O_NOFOLLOW:不追踪软链接。
上述代码中,打开 writeppt.py
文件,以只读方式打开,返回新打开文件的描述符,可以进行后续的读取、写入操作。
8. read() 使用:
import OS
fs=os.open("writeppt.py",OS.O_RDONLY) # fs 就是 writeppt.py 的文件描述符
print(OS.read(fs,24))
代码解释 :read () 方法为从文件描述符中读取文件内容,第一个参数为 open () 方法打开文件返回的文件描述符,第二个参数为读取的字节数。上述代码中读取 writeppt.py
文件 24 个字节内容。
9. write() 使用:
import os
fs=os.open("test.txt", os.O_RDWR) # fs 就是 test.txt 的文件描述符,打开模式设置为以读写的方式打开
print(os.write(fs, "hello python")) #写入内容为 hello python
代码解释:write()
方法用于写入字符串到文件描述符 fs 中,第一个参数为文件描述符,第二个参数为写入的字符串内容。代码执行完成后,输出效果如下图所示。
10. walk() 使用:
import os
for dirpath, dirnames, filenames in os.walk("D:/code"):
#输出:D:/code ['newimage'] ['index.py','test.txt','writeppt.py','writeword.py']
print(dirpath, dirnames, filenames)
代码解释:os.walk()
方法是一个简单易用的文件、目录遍历器,接收参数为要遍历的目录的地址,返回的是一个三元组 (dirpath, dirnames, filenames)
,分别表示当前正在遍历的这个文件夹的本身的地址、该文件夹中所有的目录的名字、该文件夹中所有的文件。代码中指定目录 D:/code
,执行时会遍历 D 盘 code 目录下所有文件和文件夹,输出效果如下图所示。
11. os.path.exists() 使用:
import os
print(os.path.exists("D:\\code\\index.py")) # 输出 true
print(os.path.exists("D:\\code\\test.py")) # 输出 False
代码解释 :exists()
方法判断路径是否存在,上面代码中在 D 盘 code 文件夹下存在 index.py
,所以输出 True,不存在 test.py
,输出 False。代码执行完成后,输出效果如下图所示。
12. os.path.join() 使用:
import os
# 输出D:\code\2020\11
print(os.path.join("D:\\code\\", "2020\\","11"))
代码解释: join()
方法用于把目录和文件名合成一个路径。代码执行完成后,输出效果如下图所示。
3. os 模块实战
在开发中,程序遇到异常情况时需要记录错误日志文件,为便于程序员调试,通常错误日志文件的目录结构为:当前年的文件夹下 / 当前月的文件夹下 / 当前日的文件夹 / 具体的 txt 错误日志文件
。这时可以使用 Python 的 os 模块封装创建日志的公共方法,完成需求如下:
- 根据传入的时间创建对应的年、月、日文件夹,在创建前需要判断文件夹是否存在,存在则不作操作
- 根据传入的内容,创建 txt 错误日志文件,当重复调用时,txt 错误日志文件内容为追加
根据上述需求背景,封装后的代码如下:
import os
import datetime
# 获取到当前年
year_time = datetime.datetime.now().year
# 获取到当前月
month_time = datetime.datetime.now().month
# 获取到当前日
daytime = datetime.datetime.now().day
# 生成错误日志文件
def createError(message):
path = os.getcwd()+"\\"+str(year_time)+"\\"+str(month_time)+"\\"+str(daytime)
# 文件路径是否存在
ispath = os.path.exists(path)
# 判断文件是否存在:不存在创建
if not ispath:
os.makedirs(path)
# 写入异常到错误日志文件(log.txt)
writeError(path, message)
# 写入异常到错误日志文件
def writeError(path, message):
fs = os.open(path+"\\log.txt", os.O_RDWR | os.O_CREAT)
os.write(fs, message.encode('utf-8'))
# 模拟调用
createError("SQL语句异常")
代码解释:代码中封装了两个方法分别为 createError()
方法和 writeError()
方法,用于生成错误日志存放文件夹及像 log.txt
写入错误日志内容。年月日文件夹使用 datetime 模块获取当前系统的年、月、日,使用 exists()
方法判断指定路径是否存在,返回布尔值,存在则返回 True。
如果不存在则通过 os 模块下的 makedirs()
方法进行创建。文件夹创建完成后,调用 writeError()
方法写入错误内容,首先使用 open()
方法打开 log.txt
文件,打开模式设置为读写和创建,通过 write()
方法写入错误内容到 log.txt
。代码执行完成后,输出效果如下图所示:
4. 小结
本节课程我们主要学习了 os 模块的使用。本节课程的重点如下:
- 了解 os 模块作用及使用步骤;
- 掌握 os 模块中操作文件与文件夹的使用方法。