【4】进程管理-3-python调用外部命令--os

在用python代码中总会少不了调用操作系统的一些命令,比如用Linux命令运行某个程序,这个时候os该出马了。

当然,你如果仅仅是想读写文件,可以用open();如果是像管理路径,用os.path;如果是读所有文件的所有数据,用fileinput模块;创建临时文件,用tempfile模块;高质量的文件或文件夹处理用shutil模块。

  • 反馈目前python工作路径
  • 改变目前工作路径
  • 检出文件夹或文件是否存在
  • 创建或删除文件夹
  • 返回文件夹里存在的所有文件

一、工作路径的管理

1.输出字符串指示正在使用的平台

os.name()

如果是window 则用’nt’表示,对于Linux/Unix用户,它是’posix’

2.当前完整的工作路径

os.getcwd()

或者:

os.path.abspath('.')

3.列出目前文件夹中所有的文件和文件夹

os.listdir('.')

4.更改工作路径

os.chdir('./dir1')
 os.chdir('../') #返回到上一级路径

5.检验给出的路径是否真地存在

os.path.exists('C:\\Python25\\abc.txt')

6.返回当前目录: (‘.’)

os.curdir()

7.获取当前目录的父目录字符串名:(‘..’)

os.pardir()

8.获取该脚本当前的完整路径

folder_here = os.path.dirname(os.path.realpath(__file__))

二、文件夹与文件的操作

1.创建与删除文件夹

os.makedirs('dirname1/dirname2') 可生成多层递归目录
 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
 os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
 os.mkdir('./dir2') #使用相对路径

2.检验是否存在dir2

import os
 if os.path.exists('./dir2'):
 pass
 else:
 os.mkdir('./dir2')

3.检验是否存在文件夹dir2或文件

import os
if os.path.isdir('./dir2'): #os.path.isfile()判断是否为文件
  pass
else:
  os.mkdir('./dir2')

4.文件处理

os.remove() 删除一个文件
 os.rename("oldname","newname") 重命名文件/目录
 os.stat('path/filename') 获取文件/目录信息
 os.symlink('path/filename','ln_filename') 创建符号链接,源需绝对路径
 os.utime() 修改时间属性

权限管理:

os.chmod('pathfile',os.W_OK) 改变文件权限模式
 # echo 'test' > test.sh
 >>> os.access('test.sh',os.W_OK)
 True
 >>> os.access('test.sh',os.X_OK)
 False
 >>> os.chmod('test.sh',os.X_OK)
 >>> os.access('test.sh',os.X_OK)
 True
 # ls -l test.sh
 ---------x 1 root root 12 Oct 20 23:03 test.sh

5.os.walk遍历文件

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

top表示需要遍历的目录树的路径

topdown的默认值是”True”,表示首先返回目录树下的文件,然后在遍历目录树的子目录.Topdown的值为”False”时,则表示先遍历目录树的子目录,返回子目录下的文件,最后返回根目录下的文件

onerror的默认值是”None”,表示忽略文件遍历时产生的错误.如 该函数返回一个元组,该元组有3个元素,这3个元素分别表示每次遍历的路径名,目录列表和文件列表 os.walk()举例:

>>> import os
 >>> for root, dirs, files in os.walk("wd/chat", topdown=False):
 ... for name in files:
 ... print(os.path.join(root, name)) #打印文件绝对路径
 ... for name in dirs:
 ... print(os.path.join(root, name)) #打印目录绝对路径
 ...

6.os.path.walk的遍历

os.path.walk(top,func,arg)

top表示需要遍历的目录树的路径 func表示回调函数,对遍历路径进行处理.所谓回调函数,是作为某个函数的参数使用,当某个时间触发时,程序将调用定义好的回调函数处理某个任务.回调函数必须提供3个参数:第1个参数为walk()的参数tag,第2个参数表示目录列表,第3个参数表示文件列表 arg是传递给回调参数func的元组.回调函数的一个参数必须是arg,为回调函数提供处理参数.参数arg可以为空

>>> import os
 >>> def VisitDir(arg,dirname,names):
 ... for filespath in names:
 ... print os.path.join(dirname,filespath)
 ...
 >>> path='/root/py/wd/chat'
 >>> os.path.walk(path,VisitDir,())
 /root/py/wd/chat/chat_server.py
 /root/py/wd/chat/chat_client.py
 /root/py/wd/chat/test
 /root/py/wd/chat/test/linuxeye
 /root/py/wd/chat/test/test2
 /root/py/wd/chat/test/test3
 /root/py/wd/chat/test/test2/asdf
 /root/py/wd/chat/test/test3/sdfaxx

os.path.walk()与os.walk()产生的文件名列表并不相同。os.path.walk()产生目录树下的目录路径和文件路径,而os.walk()只产生文件路径

列出文件夹内所有文件

#方法1:使用os.listdir
import os
for filename in os.listdir(r'c:\windows'):
    print filename

#方法2:使用glob模块,可以设置文件过滤
import glob
for filename in glob.glob(r'c:\windows\*.exe'):
    print filename

方法3:通过os.path.walk递归遍历,可以访问子文件夹
import os.path
def processDirectory ( args, dirname, filenames ):
   print 'Directory',dirname
   for filename in filenames:
   print ' File',filename

#方法4:非递归
#!/bin/python
import os
for dirpath, dirnames, filenames in os.walk('c:\\winnt'):
   print 'Directory', dirpath
for filename in filenames:
   print ' File', filename

def read_all_file():
   for dirpath, dirnames, input_file_names in os.walk('temp'):
   print dirpath, dirnames, input_file_names
   return input_file_names
返回文件夹下的所有文件

三、从指定路径获得文件名

os.path.basename(path):返回文件名

os.path.basename('/Users/somename/somedirectory/pythoniscool.txt')
 pythoniscool.txt


os.path.dirname(path):返回文件路径


>>> os.path.dirname('c:\\Python\\a.txt')
 'c:\\Python'

os.path.split('/Users/somename/somedirectory/pythoniscool.txt')
 ('/Users/somename/somedirectory', 'pythoniscool.txt')
 os.path.split('/Users/somename/somedirectory/pythoniscool.txt')[1]

os.path.splitext():分离文件名与扩展名

>>> os.path.splitext('a.txt')
 ('a', '.txt')

os.path.join(path,name):连接目录与文件名或目录

>>> os.path.join('c:\\Python','a.txt')
 'c:\\Python\\a.txt'
 >>> os.path.join('c:\\Python','f1')
 'c:\\Python\\f1'
 >>>

获得文件大小

os.path.getsize(name)
 如果name是目录返回0L

四、调用linux命令

os.system(“bash command”) 运行shell命令,直接显示 os.popen(“bash command”) 运行shell命令,生成对象,可赋给变量,再用read读取

>>> import os
 >>> os.system('ls twisted')
 chat_client_twisted.py chat_server_twisted.py
 0
 >>> LS = os.popen('ls twisted')
 >>> LS.readlines()
 ['chat_client_twisted.py\n', 'chat_server_twisted.py\n']

五、其他

os.linesep
字符串给出当前平台使用的行终止符。例如,Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'。

os.systeme有三个返回值:

0 代表成功
1 代表小问题
2 代表大问题

参考资料:

更详尽的说明,请参见官网os教学

http://people.rit.edu/blbgse/pythonNotes/os.html

http://blog.csdn.net/my2010sam/article/details/18315785

http://www.cnblogs.com/BeginMan/p/3327291.html

http://www.jb51.net/article/57995.htm

http://www.jbxue.com/article/12968.html

个人公众号,比较懒,很少更新,可以在上面提问题:

更多精彩,请移步公众号阅读:

Sam avatar
About Sam
专注生物信息 专注转化医学