使用python的os模块,简单方便完成对文件夹、文件及路径的管理与访问操做。
在最近开发中,常常须要对文件进行读取、遍历、修改等操做,想要快速、简单的完成这些操做,我选择用 python 。经过 python 的标准内置 os 模块,只须要几行代码,便可完成想要的操做。通过对 os 的使用,本文把 os 模块的经常使用的操做进行总结,主要分为如下几个划分:html
本文涉及经常使用 的 os 函数的使用展现,主要使用 python 交互模式下进行代码说明。后续操做默认已经引入 os 模块,以下:java
import os
以本地 E://pythontest
目录做为演示目录,此目录下当前文件以下:node
test │ test.txt └─test-1 test-1.txt
test
及 test-1
是文件夹,test.txt
及 test-1.txt
是文件。python
熟悉 linux 同窗应该对 ls
/ pwd
/ cd
等操做不陌生,对应的 python 也有对应的方法,主要包括:linux
>>> os.chdir("E://pythontest") # 更改目录 >>> os.getcwd() # 获取当前目录 'E:\\pythontest' >>> os.listdir("test") # 文件及目录列表,相对路径 ['test-1', 'test.txt'] >>> os.listdir("E://pythontest/test") # 文件及目录列表,绝对路径 ['test-1', 'test.txt'] >>> os.stat("test") # 获取目录信息 os.stat_result(st_mode=16895, st_ino=4503599627377599, st_dev=266147611, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1590833033, st_mtime=1590832647, st_ctime=1590832207) >>> os.stat("test/test.txt") # 获取文件信息 os.stat_result(st_mode=33206, st_ino=2251799813692354, st_dev=266147611, st_nlink=1, st_uid=0, st_gid=0, st_size=4, st_atime=1590832653, st_mtime=1590832609, st_ctime=1590832598)
其中 stat 函数返回的是文件或者目录的基本信息,具体以下:shell
平常使用中,咱们通常使用 st_size 、st_ctime 及 st_mtime 获取文件大小,建立时间,修改时间。另外,咱们看到输出的时间是秒数,在这里提一下,关于日期的转换处理。缓存
(1)秒数转日期时间格式字符串分布式
>>> import time # 引入time模块 >>> timestruct = time.localtime(1590803070) # 转换为时间结构体 >>> print(timestruct) time.struct_time(tm_year=2020, tm_mon=5, tm_mday=30, tm_hour=9, tm_min=44, tm_sec=30, tm_wday=5, tm_yday=151, tm_isdst=0) >>> time.strftime("%Y-%m-%d %H:%M:%S",timestruct) # 格式化时间 '2020-05-30 09:44:30'
(2)格式日期时间字符串转秒数函数
>>> import datetime # 引入datetime模块 >>> timeobject = datetime.datetime.strptime("2020-05-23 10:00:00","%Y-%m-%d %H:%M:%S") #解析时间字符串为时间对象 >>> timeseconds=time.mktime(timeobject.timetuple()) # 获取时间秒数 >>> print(int(timeseconds)) # 转为int显示 1590199200
walk 函数对目录进行递归遍历,返回 root,dirs,files,分别对应当前的遍历的目录,此目录中的子目录及文件。ui
>>> data = os.walk("test") # 遍历test目录 >>> for root,dirs,files in data: # 递归遍历及输出 ... print("root:%s" % root) ... for dir in dirs: ... print(os.path.join(root,dir)) ... for file in files: ... print(os.path.join(root,file)) ... root:test test\test-1 test\test-2 test\test.txt root:test\test-1 test\test-1\test-1.txt root:test\test-2 test\test-2\test-2.txt
>>> os.mkdir("test") >>> os.mkdir("test1/test1-1") # 父目录不存在,报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'test1/test1-1' >>> os.makedirs("test1/test1-1") # 父目录不存在,自动建立 >>> os.listdir("test1") ['test1-1']
>>> os.rmdir("test1") # 若目录不为空,报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> OSError: [WinError 145] 目录不是空的。: 'test1' >>> os.rmdir("test1/test1-1") >>> os.removedirs("test1/test1-1") # 删除多级空目录 >>> os.listdir(".") ['test']
因为删除空目录的限制,更多的是使用 shutil
模块中的 rmtree
函数,能够删除不为空的目录及其文件。
>>> os.makedirs("test1/test1-1") >>> os.rename("test1/test1-1","test1/test1-2") # test1-1 修改成test1-2 >>> os.listdir("test1") ['test1-2'] >>> os.rename("test1/test1-2","test2/test2-2") # 因为test2目录不存在,报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'test1/test1-2' -> 'test2/test2-2' >>> os.renames("test1/test1-2","test2/test2-2") # renames可自动建立不存在的目录 >>> os.listdir("test2") ['test2-2']
若是目标路径文件已经存在,那么os.rename()和os.renames()都会报错:FileExistsError: [WinError 183] 当文件已存在时,没法建立该文件。
>>> f = os.open("test/test.txt", os.O_RDWR|os.O_CREAT) # 打开文件 >>> str_bytes = os.read(f,100) # 读100字节 >>> str = bytes.decode(str_bytes) # 字节转字符串 >>> print(str) test write data >>> os.close(f) # 关闭文件
注意 open/read/close 须要一块儿操做,其中 open 操做须要指定模式,上述是以读写模式打开文件,若文件不存在则建立文件。各模式具体以下:
flags -- 该参数能够是如下选项,多个使用 "|" 隔开:
前面已提到,使用 open ,指定模式, 若文件不存在,则建立。有点相似 linux 操做中的 touch。
>>> f = os.open("test/test.txt", os.O_RDWR|os.O_CREAT) # 若文件不存在,则建立 >>> os.close(f)
>>> f = os.open("test/test.txt", os.O_RDWR|os.O_CREAT) # 打开文件 >>> os.write(f,b"test write data") # 写入内容 15 >>> os.close(f) # 关闭文件
>>> os.remove("test/test-1") # 删除目录报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> FileNotFoundError: [WinError 2] 系统找不到指定的文件。: 'test/test1' >>> os.remove("test/test.txt") # 删除文件 >>> os.listdir("test") ['test-1']
在使用文件或目录过程当中,常常须要对文件及目录路径进行处理,所以,os 中有一个子模块 path,专门就是处理路径操做的。主要有如下操做:
>>> os.path.abspath("test") 'E:\\pythontest\\test'
>>> os.path.exists("test") True >>> os.path.exists("test/test.txt") False >>> os.path.exists("test/test-1/test-1.txt") True
>>> os.path.isdir("test") True >>> os.path.isfile("test/test-1/test-1.txt") True
/
为分割符,分为头(head) 和尾(tail)两部分,tail 是 basename 返回的内容,head 是 dirname 返回的内容。常常用于获取文件名,目录名等操做>>> os.path.basename("test/test-1/test-1.txt") # 文件名 'test-1.txt' >>> os.path.basename("test/test-1/") # 空内容 '' >>> os.path.basename("test/test-1") # 目录名 'test-1' >>> os.path.dirname("test/test-1/test-1.txt") # 文件所在目录路径 'test/test-1' >>> os.path.dirname("test/test-1/") # 目录路径 'test/test-1' >>> os.path.dirname("test/test-1") # 父目录路径 'test'
>>> os.path.join("test","test-1") # 链接两个目录 'test\\test-1' >>> os.path.join("test\\test-1","test-1.txt") # 链接目录与文件名 'test\\test-1\\test-1.txt'
>>> os.path.split("test/test-1") # 分割目录 ('test', 'test-1') >>> os.path.split("test/test-1/") # 以/结尾的目录分割 ('test/test-1', '') >>> os.path.split("test/test-1/test-1.txt") # 分割文件 ('test/test-1', 'test-1.txt')
>>> os.path.splitext("test/test-1") ('test/test-1', '') >>> os.path.splitext("test/test-1/") ('test/test-1/', '') >>> os.path.splitext("test/test-1/test-1.txt") # 区分文件名及扩展名 ('test/test-1/test-1', '.txt') >>> os.path.splitext("test/test-1/test-1.txt.tmp") # 以最后的"."为分割点 ('test/test-1/test-1.txt', '.tmp')
下面以一些平时使用到的场景,对前面的操做函数进行综合使用。
def batch_rename(dir_path): itemlist = os.listdir(dir_path) # 获取目录文件列表 for item in itemlist: # 链接成完整路径 item_path = os.path.join(dir_path, item) print(item_path) # 修改文件名 if os.path.isfile(item_path): splitext = os.path.splitext(item_path) os.rename(item_path, splitext[0] + "-副本" + splitext[1])
def walk_ext_file(dir_path,ext): # 遍历 for root, dirs, files in os.walk(dir_path): # 获取文件名称及路径 for file in files: file_path = os.path.join(root, file) file_item = os.path.splitext(file_path) # 输出指定扩展名的文件路径 if ext == file_item[1]: print(file_path)
def sort_file(dir_path): # 排序前 itemlist = os.listdir(dir_path) print(itemlist) # 正向排序 itemlist.sort(key=lambda filename: os.path.getmtime(os.path.join(dir_path, filename))) print(itemlist) # 反向排序 itemlist.sort(key=lambda filename: os.path.getmtime(os.path.join(dir_path, filename)), reverse=True) print(itemlist) # 获取最新修改的文件 print(itemlist[0])
在须要对文件或者目录进行操做时,python 是一个简单快速选择。本文经过 python 的标准内置 os 模块及子模块 os.path 的经常使用方法进行介绍,最后结合使用场景进行综合使用。相信已经知足你们对文件及目录操做的大部分需求。
https://www.cnblogs.com/yufeihlf/p/6179547.html
https://www.runoob.com/python/os-file-methods.html
https://www.runoob.com/python/python-os-path.html
个人公众号(搜索Mason技术记录
),获取更多技术记录: