一、os模块概述
Python os模块包含普遍的操作系统功能。如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的。如果我们要操作文件、目录,可以在命令行下面输入操作系统提供的各种命令来完成。比如dir、cp等命令。其实操作系统提供的命令只是简单地调用了操作系统提供的接口函数,Python内置的os模块也可以直接调用操作系统提供的接口函数。
二、os模块常用方法
1. os.name:
判断现在正在实用的平台,Windows 返回 ‘nt'; Linux 返回’posix'
>>> os.name 'posix'
2. os.uname():
返回更详细的系统信息
>>> os.uname() ('Linux', 'kali', '3.18.0-kali3-686-pae', '#1 SMP Debian 3.18.6-1~kali2 (2015-03-02)', 'i686')
3. os.getcwd()
函数得到当前工作目录,即当前Python脚本工作的目录路径。
>>> os.getcwd() '/usr/peic'
返回指定目录下的所有文件和目录名。
>>> os.listdir(os.getcwd()) ['python'
5. os.remove()
删除一个文件
6. os.system()
运行shell命令。
>>> os.system('dir') python 0
7. os.sep和os.linesep
给出当前操作系统特定的路径分割符和使用的行终止符
>>> os.sep '/' >>> os.linesep #Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'。 '\n'
8、os.path.split()
返回一个路径的目录名和文件名
>>> os.path.split('/usr/peic/python/TestTxt.txt') ('/usr/peic/python', 'TestTxt.txt'
9、os.path.isfile()和os.path.isdir()
分别检验给出的路径是一个文件还是目录。
>>> os.path.isdir('/usr/peic') True >>> os.path.isfile('/usr/peic') False >>> os.path.isfile('/usr/peic/python/TestTxt.txt') True
10、os.path.exists()
检验给出的路径是否真地存在
>>> os.path.exists('/usr/peic/python/TestTxt.txt') True >>> os.path.exists('/usr/peic/python/TestTxt') Fals
11、os.path.abspath(name)
获得绝对路径
>>> os.path.exists('./python/TestTxt.txt') True >>> os.path.abspath('./python/TestTxt.txt') '/usr/peic/python/TestTxt.txt'
12、os.path.normpath(path):
规范path字符串形式
>>> os.path.normpath('./python') 'python'
13、os.path.getsize(name)
获得文件大小,如果name是目录返回0L
>>> os.path.getsize('./python/TestTxt.txt') 13L >>> os.path.getsize('./python') 4096L
14、os.path.splitext()
分离文件名与扩展名
>>> os.path.splitext('a.txt') ('a', '.txt')
15、os.path.join(path,name)
连接目录与文件名或目录
>>> os.path.join('./python','a.txt') './python/a.txt'
16、os.path.basename(path)
返回文件名
>>> os.path.basename('./python/a.txt') 'a.txt
17、os.path.dirname(path):返回文件路径
>>> os.path.dirname('./python/a.txt') './python'
三、例子(自己一个调试错误的说明)
例子说明:要求能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径。
注:dir_l()函数与本例无关
#---coding:utf-8 __author__ = 'peic' import os def dir_l(dir=os.getcwd()): 'This function list all content in the current directory' #获取目录下的所有文件和目录名 contentList = os.listdir(dir) #获得目录 dirList = [x for x in contentList if os.path.isdir(x)] print('Directory included in current dir: ') if dirList == []: print(' Current directory has no directory!') for x in dirList: print(' %s' %x) #获得文件 fileList = [x for x in contentList if os.path.isfile(x)] print('\n\nFile included in current dir: ') for x in fileList: print(' %s' %x) def fileSearch(name, dir): nameStr = str(name) if(nameStr == '' or nameStr == None): print('Name is error, plz input again') else: #获取当前目录下的所有文件和目录名 contentList = os.listdir(dir) #搜索当前目录下的文件 <span style="color:#FF0000;">#fileList = [x for x in contentList if os.path.isfile(x))]</span> <span style="color:#FF0000;"> fileList = [x for x in contentList if os.path.isfile(os.path.join(dir, x))]</span> for f in fileList: if(f.find(nameStr, 0, len(f)) != -1): f = os.path.join(os.path.abspath(f),f) print(' %s' %f) #在子目录下搜索 dirList = [x for x in contentList if os.path.isdir(x)] for d in dirList: dir = os.path.join(dir, d) fileSearch(nameStr, dir) if __name__ == '__main__': fileSearch('py',dir=os.getcwd())
最开始我用
<span style="color:#FF0000;">fileList = [x for x in contentList if os.path.isfile(x))]</span> <span style="color:#FF0000;"> </span>对搜索到的内容进行判断是否是一个文件,程序只能运行在当前目录下:
root@kali:/usr/peic/python# python ./OS_OperationDemo.py /usr/peic/python/OS_OperationDemo.py/OS_OperationDemo.py /usr/peic/python/IO_Demo.py/IO_Demo.py root@kali:/usr/peic/python# cd .. root@kali:/usr/peic# python ./python/OS_OperationDemo.py在其他目录运行没有结果
查询发现:
<span style="color:#FF0000;">fileList = [x for x in contentList if os.path.isfile(os.path.join(dir, x))]</span>
能够正常运行:
root@kali:/usr/peic# python ./python/OS_OperationDemo.py /usr/peic/OS_OperationDemo.py/OS_OperationDemo.py /usr/peic/IO_Demo.py/IO_Demo.py
listdir()只返回文件名,不包含完整路径,在其他目录下测试isfile()当然是False了,需要用os.path.isfile(os.path.join(currentpath, filename)),改为: