【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
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn