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

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

当然,你如果仅仅是想读写文件,可以用open();如果是像管理路径,用os.path;如果是读所有文件的所有数据,用fileinput模块;创建临时文件,用tempfile模块;高质量的文件或文件夹处理用shutil模块。
  • 反馈目前python工作路径
  • 改变目前工作路径
  • 检出文件夹或文件是否存在
  • 创建或删除文件夹
  • 返回文件夹里存在的所有文件

一、工作路径的管理

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

os.name()

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

1.2 当前完整的工作路径

os.getcwd()

或者:

os.path.abspath('.')

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

os.listdir('.')

1.4 更改工作路径

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

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

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

1.6 返回当前目录: ('.')

os.curdir()	

1.7 获取当前目录的父目录字符串名:('..')

os.pardir()

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

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

1.9 环境变量的设定

使用os.environ.setdefault方法写入(或者直接写入~/.bash_profile等一系列文件中,注意访问权限的问题),os.getenv或者os.environ.get读取:

print(os.environ.setdefault(‘A’, ‘1’)) # 输出1 
print(os.getenv(‘A’)) # 输出1

直接写入~/.bash_profile等一系列文件中,注意访问权限的问题;然后使用

os.popen(command).read().strip(‘\n’)

读出: 

env_value = os.popen(command).read().strip(‘\n’) # 该方法可以输出变量值

os.getenv和os.getenvb方法:os.getenv返回str;os.getenvb返回bytes

二、文件夹与文件的操作

2.1 创建与删除文件夹

os.makedirs('dirname1/dirname2') 可生成多层递归目录
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname

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

os.unlink('文件') #删除文件;如果是一个文件夹,则返回错误;该方法没有返回值。

2.2 检验是否存在dir2

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

2.3 检验是否存在文件夹dir2或文件

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

2.4 文件处理

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

2.5 权限管理:

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

2.6 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)) #打印目录绝对路径

2.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()只产生文件路径

2.7 列出文件夹内所有文件

#方法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
返回文件夹下的所有文件

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

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

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

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

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

3.3 os.path.split

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

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

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

3.5 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'

3.6 获得文件大小

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

if os.path.getsize(name) == 0 :
	return "该文件为空"

四、调用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.system有三个返回值:

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

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn