os模块提供了对系统环境、文件、目录等操作系统级的接口函数。本文主要描述os模块和os.path模块常用函数以及常用实例。
os模块函数
os.getcwd() 获取当前工作的目录。
os.listdir('dirname') 获取指定目录下的文件和目录。缺点是不能递归显示。
os.makedirs('dirname1/dirname2') 递归创建目录。在dir_temp目录下创建data_m1目录,在data_m1目录下创建data_m2目录。
os.removedirs('dirname') 若目录为空,则删除。不好用,建议使用shutil.rmtree()。比如data_m1目录下存在123.txt文件和data2_m2目录。
上述命令执行成功后,只删除data2_m2空文件夹,data_m1由于存在123.txt文件没有删除。要想全部删除,建议使用shutil.rmtree()
os.mkdir('dirname') 创建目录;相当于shell中mkdir命令。下述命令在data_m1目录下创建data2_m2文件。但是如果在不存在的目录下创建目录会失败,同时如果指定目录下创建已有指定目录也会失败。
os.rmdir('dirname') 删除空目录,若目录不为空则无法删除。只能删除空目录,不好用。
os.chdir('dirname') 切换到执行目录。如下从当前目录切换到c: emp目录下。
os.remove(path) 删除path指定的文件。文件必须存在,否在会报错。
os.rename(old,new) 重命名文件或目录。文件名123.txt修改为456.txt
os.stat(path) 获取path指定文件的所有属性
os.system('command') 执行系统外部命令,可以获取返回命令结果码,但是无法获取命令执行输出结果,输出结果直接打印到屏幕终端。
os.environ 获取系统环境变量。以字典形式返回。
想要获取指定变量可以使用如下格式
os.path模块函数
os.path.abspath(path) 获取path绝对路径。返回当前目录下123.txt文件的绝对路径
os.path.split(path) 分割成目录和文件名,以二元组形式返回。
os.path.splitext(path) 从路径中分割出文件的扩展名
os.path.dirname(path) 获取文件路径
os.path.basename(path) 获取文件名
os.path.exists(path) 判断文件或目录是否存在
os.path.isabs(path) 判断输入的路径是否为绝对路径
os.path.isfile(path) 判断是否为文件
os.path.isdir(path) 判断是否为目录
os.path.join(path1[, path2[, ...]]) 组合多个路径
os.path.getctime(filename) 获取文件或者目录的创建时间
os.path.getatime(filename) 获取文件或者目录的最后存取时间
os.path.getmtime(filename) 获取文件或者目录的最后修改时间
os.path.getsize(filename) 获取文件大小,如果为目录,返回0
重点函数介绍
1、os.walk()
语法
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
参数描述
top 指定搜索目录
topdown 可选参数,默认值为True, 表示先返回顶级目录下的文件,然后再遍历子目录中的文件。如果为False,表示先遍历子目录中的文件,然后再返回顶级目录下的文件。
onerror 可选,默认值为None,表示忽略文件遍历时的错误。如果不为空,则提供一个自定义函数提示错误信息后继续遍历或抛出异常中止遍历。
followlinks 可选参数,默认值为False。表示是否要跟随目录下的链接去继续遍历,要注意的是,os.walk不会记录已经遍历的目录,所以跟随链接遍历的话有可能一直循环调用下去。
输出
返回3元组(dirpath, dirnames, filenames)。其中dirpath表示目录的路径,是一个字符串。dirnames 是一个列表,包含了dirpath下所有子目录的名字。filenames是一个列表,包含了非目录文件的名字。这些名字不包含路径信息,如果需要得到全路径,需要使用os.path.join(dirpath, name)
常用实例
1、目录和文件的创建、删除
#-*- coding:utf-8 -*-# import os import shutil #全局变量 cur_dir = os.getcwd() new_dir = os.path.join(cur_dir,'temp') #判断new_dir目录是否存在,不存在则创建。如果存在则删除再创建 if not os.path.exists(new_dir): os.makedirs(new_dir) else: shutil.rmtree(new_dir) os.makedirs(new_dir) #创建tmp.log文件并写入内容 new_file = os.path.join(new_dir,'tmp.log') fp = open(new_file,'w') fp.write('test') fp.close()
2、查找d:dir_temp目录下的所有文件,以绝对路径输出文件名
# -*- coding: utf-8 -*-
import os
search_dir = 'd:\dir_temp'
for root, dirs, files in os.walk(search_dir):
for name in files:
print os.path.join(root, name)
运行结果如下:
3、获取指定文件相关属性
# -*- coding: utf-8 -*- import os filename = 'd:\dir_temp\data_m1\456.txt' file_stat = os.stat(filename) print(file_stat) # 获取文件所属用户ID print('os.stat.st_uid = %s ' % (file_stat.st_uid,)) #获取文件所属组ID print('os.stat.st_gid = %s ' % (file_stat.st_gid,)) #获取文件大小,以字节输出 print('os.stat.st_size = %s ' % (file_stat.st_size,)) #获取最近访问时间 print('os.stat.st_atime = %s ' % (file_stat.st_atime,)) #获取最近修改时间 print('os.stat.st_mtime = %s ' % (file_stat.st_mtime,)) #获取创建时间。某些系统上(如Unix)是最新数据更改的时间。 print('os.stat.st_ctime = %s ' % (file_stat.st_ctime,))
运行结果如下
4、根据关键字搜索指定目录下的文件,并输出文件名
#-*- coding:utf-8 -*-#
import os
import sys
import re
if len(sys.argv[1:]) == 0:
print 'Please input search key words'
sys.exit(1)
search_keyword = sys.argv[1:]
search_dir = os.getcwd()
filelists = []
for root, dirs, files in os.walk(search_dir):
for filename in files:
file_path = os.path.join(root, filename)
pattern = '.*?'.join(search_keyword)
regex = re.compile(pattern)
fp = open(file_path,'r')
for line in fp.readlines():
match = regex.search(line)
if match:
print file_path
break
5、统计指定目录下的文件和文件夹大小,类似linux上的du功能
#-*- coding:utf-8 -*-#
import os
DIRECTORY = 'D:\worktools'
def getDirSize(dir):
size = 0
for root, dirs, files in os.walk(dir):
size += sum([os.path.getsize(os.path.join(root, file)) for file in files])
return size
if __name__ == '__main__':
for file in os.listdir(DIRECTORY):
filepath = os.path.join(DIRECTORY,file)
if os.path.isdir(filepath):
dirsize = getDirSize(filepath)
print "%s %.2fM" % (filepath,(dirsize/1024/1024))
else:
dirsize = os.path.getsize(os.path.join(DIRECTORY,filepath))
print "%s %.2fM" % (filepath,(dirsize/1024/1024))
输出结果如下:
D:worktoolsalipay_wap_main.apk 46.00M
D:worktoolsBeyond_Compare-Trial-YY.exe 31.00M
D:worktoolsjava 2393.00M
D:worktoolsjd-gui-0.3.3.windows 0.00M
D:worktools
pp_7.3.3_Installer.exe 2.00M
D:worktoolsoracle 11g 1243.00M
D:worktoolsoracle 11g enterprise 2241.00M
D:worktools eamviewer 12.00M
D:worktoolsTortoiseSVN-1.9.4.27285-x64-svn-1.9.4.msi 17.00M
D:worktoolswps 356.00M
D:worktoolsxmanager 41.00M
D:worktoolsxmanager.rar 41.00M
D:worktoolszhaoshangyinxing_422.apk 39.00M
D:worktools反编译 0.00M