Python os模块包含普遍的操作系统功能。如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的。可以在命令行中输入help(),然后输入os,就能看到os的所有方法。
一. 常用方法
1 os.name
判断现在正在使用的平台,windows返回 ‘nt’; Linux 返回’posix’.
2 os.path
返回os模块所在的路径
3 os.getcwd()
返回当前的工作目录,即当前python脚本所在的工作目录.
4 os.listdir(folder)
指定所有目录下所有的文件和目录名.如果我们想要遍历某个目录下的所有文件,就可用到此,举个栗子:
#遍历folder中的所有文件并打开这些文件
import os
files = os.listdir(folder)
for filename in files:
file = folder + filename
fr = open(file)
…………
5 os.remove(path)
删除指定文件
6 os.rmdir(folder)
删除指定目录
7 os.mkdir(floder)
创建单层目录
8 os.makedirs(folder)
递归建立目录
9 os.path.isdir(name)
判断name是不是一个目录,name不是目录就返回false
10 os.path.isfile(name)
判断name是不是一个文件,不存在name也返回false
11 os.path.exists(name)
判断是否存在文件或目录name
12 os.path.getsize(name)
获得文件大小,如果name是目录返回0L
13 os.path.abspath(file/folder)
获得文件或者目录的绝对路径
14 os.path.pardir
获得父目录
15 os.path.normpath(path)
规范path字符串形式
os.path.normpath("a/b/c\d") #输出'a/b/c\\d'
os.path.normpath("a://b/c/d") #输出'a:/b/c/d'
16 os.path.split(path)
分割文件名与目录(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)
os.path.split("/a/b/c/test.txt") #输出('/a/b/c', 'test.txt')
os.path.split("/a/b/c/") #输出('/a/b/c', '')
17 os.path.splitext(path)
分离文件名与扩展名
os.path.split("/a/b/c/test.txt") #输出('/a/b/c/test', '.txt')
18 os.path.join(path,name)
连接目录与文件名或目录
19 os.path.basename(path)
返回文件名
20 os.path.dirname(path)
返回目录名
21 os.path.realpath(filename)
返回文件的真实目录,和os.path.abspath()类似
22 os.chdir(folder)
改变工作目录到folder
#在'/a/b/c/test.py'中需要执行'/d/e/hadoop/'目录下的'./bin/hadoop fs -ls ……',除了直接用绝对路径外,还可以在程序中改变工作目录
os.chdir('/d/e/hadoop/')
os.getcwd() # '/d/e/hadoop'
23 os.curdir
返回但前目录(’.’)
24 os.sep
操作系统路径分隔符
25 os.getenv()和os.putenv()
分别用来读取和设置环境变量
二. os.environ详解
os.environ可以获得一些有关系统的各种信息。对于官方的解释,environ是一个字符串所对应环境的映像对象。这是什么意思呢?举个例子来说,environ[‘HOME’]就代表了当前这个用户的主目录。
windows:
os.environ[‘HOMEPATH’] #当前用户主目录。
os.environ[‘TEMP’] #临时目录路径。
os.environ[PATHEXT’] #可执行文件。
os.environ[‘SYSTEMROOT’] #系统主目录。
os.environ[‘LOGONSERVER’] #机器名。
os.environ[‘PROMPT’] #设置提示符。
linux:
os.environ[‘USER’] #当前使用用户。
os.environ[‘LC_COLLATE’] #路径扩展的结果排序时的字母顺序。
os.environ[‘SHELL’] #使用shell的类型。
os.environ[‘LAN’] #使用的语言。
os.environ[‘SSH_AUTH_SOCK’] #ssh的执行路径。
三. python执行系统命令的方法
1 os.system(cmd)
返回命令执行的状态,0表示执行成功。
2 os.popen(cmd)
可以返回命令执行的内容,是file read的对象。因此需要read(),readlines()或者for循环获得返回的内容,但是没有显示命令执行的状态。
3.subprocess.Popen
popen函数有一个缺陷,就是它是一个阻塞的方法。如果运行cmd时产生的内容非常多,函数非常容易阻塞住。解决办法是不使用wait()方法,但是也不能获得执行的返回值了。
subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
部分参数的解释:
1) .args
args参数可以是一个字符串,可以是一个包含程序参数的列表。要执行的程序一般就是这个列表的第一项,或者是字符串本身。
subprocess.Popen([“cat”,”test.txt”])
subprocess.Popen(“cat test.txt”)
这两个之中,后者将不会工作。因为如果是一个字符串的话,必须是程序的路径才可以。但是下面的可以工作
subprocess.Popen(“cat test.txt”, shell=True)
这是因为它相当于
subprocess.Popen([“/bin/sh”, “-c”, “cat test.txt”])
args一般要是一个【列表】。如果args是个字符串的话,会被当做是可执行文件的路径,这样就不能传入任何参数了。
2) .stdin stdout和stderr
stdin stdout和stderr,分别表示子程序的标准输入、标准输出和标准错误。可选的值有PIPE或者一个有效的文件描述符(其实是个正整数)或者一个文件对象,还有None。如果是PIPE,则表示需要创建一个新的管道,如果是None, 不会做任何重定向工作,子进程的文件描述符会继承父进程的。另外,stderr的值还可以是STDOUT,表示子进程的标准错误也输出到标准输出。
Popen对象:
from subprocess import Popen, PIPE
Popen('ls',shell=True,stderr=PIPE,stderr=PIPE)
p.wait()
if(p.returncode == 0):
……
4 commands.getstatusoutput(cmd)
它不是一个阻塞的方法,即没有Popen函数阻塞的问题。它会返回命令执行的状态和返回值(字符串)。
import commands
status, output = commands.getstatusoutput("ls")