os模块中包含了一系列文件操做的函数,这里介绍的是一些在Linux平台上应用的文件操做函数。因为Linux是C写的,低层的libc库和系统调用的接口都是C API,而Python的os模块中包括了对这写接口的Python实现,经过Python的os模块,能够调用系统的功能,进行系统编程。html
下面介绍一下os模块中提供的一些文件操做(仅限Unix平台):node
os.fdopen(fd, [mode, [bufsize]])编程
经过文件描述符 fd 建立一个文件对象,并返回这个文件对象async
fd参数是一个打开的文件的描述符,在Unix下,描述符是一个小整数。函数
mode参数是可选的,和buffersize参数和Python内建的open函数同样,mode参数能够指定‘r,w,a,r+,w+,a+,b’等,表示文件的是只读的仍是能够读写的,以及打开文件是以二进制仍是文本形式打开。这些参数和C语言中的<stdio.h>中fopen函数中指定的mode参数相似。post
bufsize参数是可选的,指定返回的文件对象是否带缓冲:buffersize=0,表示没有带缓冲;bufsize=1,表示该文件对象是行缓冲的;bufsize=正数,表示使用一个指定大小的缓冲冲,单位为byte,可是这个大小不是精确的;bufsize=负数,表示使用一个系统默认大小的缓冲,对于tty字符设备通常是行缓冲,而对于其余文件则通常是全缓冲。若是这个参数没有制定,则使用系统默认的缓冲设定。测试
os.popen(command, [mode, [bufsize]])ui
开启一个子进程执行一个command指定的命令,在父进程和子进程之间创建一个管道pipe,用于在父子进程间通讯。返回一个文件对象,能够对这个文件对象进行读或写,取决于参数mode,若是mode指定了只读,那么只能对文件对象进行读,若是mode参数指定了只写,那么只能对文件对象进行写操做。spa
command参数指定须要在子进程中执行的命令.code
mode参数和bufsize参数和上述的os.fdopen同样。
os.popen函数还有一些其余的变种,能够按须要使用:
os.popen2(command, [mode, [bufsize]])
在子进程中执行命令command,返回一个二元组(child_stdin, child_stdout)
os.popen3(command, [mode, [bufsize]])
在子进程中执行命令command,返回一个三元组(child_stdin, child_stdout, child_stderr)
os.popen4(command, [mode, [bufsize]])
在子进程中执行命令command,返回一个二元组(child_stdin, child_stdout_and_stderr)
os.tmpfile()
返回一个以”w+b“模式打开的文件对象,该文件对象对应的文件没法经过目录访问,这是一个临时文件,当文件对象被关闭的时候,该临时文件也就被删除。
os.close(fd)
以文件描述符fd为参数来关闭fd指向的打开的文件。
os.closerange(fd_low, fd_high)
关闭一些列连续的文件描述符,文件描述符的范围从fd_low到fd_high - 1。
os.dup(fd)
返回一个复制的文件描述符,返回的描述符指向的文件和描述符fd指向的文件是一致的。
os.dup2(fd, fd2)
复制一个描述符fd,产生一个描述符fd2,若是fd2指向的文件打开着,则关闭该文件,使得释放这个被占用的文件描述符。
os.fchmod(fd, mode)
改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限。至关于Unix下的chmod命令,只是这里是系统提供的一个改变文件权限的接口,文件权限包括”rwx”表示的读,写,执行权限,以及针对用户的”ugo“三个对象,表示拥有者用户,组用户,其余用户。
os.fchown(fd, uid, gid)
修改一个文件的全部权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指示。若是uid和gid中任何一个设置为-1,则表示不对其进行修改。
os.fdatasync(fd)
强制将文件写入磁盘,该文件由文件描述符fd指示,可是不强制更新文件的状态信息。
os.fstat(fd)
返回包含了文件描述符fd指向的文件的文件信息,这个函数的实现和stat()系统调用是同样的,返回文件的信息:
st_mode - 文件信息的掩码,包含了文件的权限信息,文件的类型信息(是普通文件仍是管道文件,或者是其余的文件类型)
st_ino - 文件的i-node值
st_dev - 设备信息
st_nlink - 硬链接数
st_uid - 用户ID
st_gid - 组ID
st_size - 文件大小,以byte为单位
st_atime - 文件最近的访问时间
st_mtime - 文件最近的修改时间
st_ctime - 文件状态信息的修改时间(不是文件内容的修改时间)
不一样的Unix系统上可能还会有一写扩展的信息可供调用。如在Linux系统上,还包含了以下的一些信息:
st_blocks - 文件的是由多少个 512 byte 的块构成的
除了上述的fstat()函数,os模块还包含了stat(),lstat()等函数,用于获取文件信息。
os.ftruncate(fd, length)
将文件大小截断为length字节长度,若是length指定为0,则至关于在os.open()一个文件的时候指定os.O_TRUNC选项,文件描述符指示截断的文件。
os.isatty(fd)
检查一个文件描述符fd指示的文件是不是一个tty字符设备文件,若是是,则返回true,不然返回false。
os.lseek(fd, pos, how)
设置文件偏移位置,文件由文件描述符fd指示。这个函数依据how参数来肯定文件偏移的起始位置,pos参数指定位置的偏移量。
how参数的值为:
os.SEEK_SET - 文件的开头, 能够用 0 代替
os.SEEK_CUR - 当前的文件偏移处, 能够用 1 代替
os.SEEK_END - 文件结尾, 能够用 2 代替
os.open(file, flags[, mode])
打开一个文件,而且设置须要的打开选项,mode参数是可选的,若是flags选项中包含了os.O_CREAT选项,则须要指定mode参数,指示文件建立时使用的权限。函数返回一个文件描述符,用于对该文件的访问。
flags经常使用参数(能够参看Linux man-page open(2)):
os.O_RDONLY - 文件以只读方式打开
os.O_WRONLY - 文件以只写方式打开
os.O_RDWR - 文件以读写方式打开
os.O_APPEND - 文件以添加方式打开
os.O_TRUNC - 文件大小截断为0
os.O_CREAT - 若是文件不存在,则建立文件
os.O_EXCL - 若是文件存在,而且指定了os.O_CREAT,则在指定该选项的状况下os.open调用会抛出OSError异常。
这个os.open()调用是一个低层的I/O调用,至关于在C API中的open系统调用。在使用的时候可使用Python内建的open函数,该函数是对这个低层I/O的封装。
os.pipe()
建立一个用于父子进程间通讯的管道,返回一个二元组(read_fd, write_fd),read_fd指示建立的管道的读描述符,write_fd指示建立的管道的写描述符。关于Linux下管道的信息,能够参看 IPC-管道 。
os.read(fd, n)
从fd指示的文件中读取最多n个字节的数据,函数返回一个包含读取内容的字符串对象。若是读取到文件尾,则返回一个空字符串对象。
os.write(fd, str)
将字符串str写入到文件中,文件描述符fd指示处理的文件,函数返回实际写入的字节个数。
os.access(path, mode)
使用实际的uid和gid去测试路径的访问权。实际的uid和gid指的是用户登陆到系统使用的uid和当前用户所在的gid,这和有效用户id和有效组id是有区别的,有效用户id和有效组id是对应于进程的。
mode参数指定测试路径的方式:
os.F_OK - 测试路径是否存在
os.R_OK - 测试文件是否可读
os.W_OK - 测试文件是否可写
os.X_OK - 测试文件是否可执行
其中的R_OK,W_OK,X_OK是可使用OR操做合起来进行一块儿测试的。
函数返回True若是测试成功,不然返回False。在系统的C API中可使用access系统调用。
os.chdir(path)
切换当前的工做目录为path指定的目录,至关于Linux下cd命令的功能。
os.fchdir(fd)
经过文件描述符切换当前的工做目录到文件描述符指示的目录,fd参数必须指向打开的目录,不能是文件。
os.getcwd()
以字符串的形式返回当前的工做目录。
os.chroot(path)
切换当前进程的root目录到指定的path路径下,这个函数能够方便的为当前的进程建立一个自定义的运行环境,若是想建立一个沙盒运行环境,这个函数就颇有用,功能相似于Linux下的chroot命令。
os.chmod(path, mode)
修改路径的权限,mode参数指定了须要设置的权限。这个函数和os.fchmod()功能一致,区别是os.fchmod处理的是一个文件描述符,也就是说须要先打开一个文件获取该文件的文件描述符后才能够进行操做,而os.chmod()直接在文件名上进行操做。
mode参数定义在 stat 模块中:
stat.S_ISUID – 设置用户ID
stat.S_ISGID - 设置用户组ID
stat.S_ISVTX - 设置粘滞位,目前只对目录有效,至关于在Linux中的SBIT位。
stat.S_IRUSR - 设置用户读权限位
stat.S_IWUSR - 设置用户写权限位
stat.S_IXUSR - 设置用户执行权限位
stat.S_IRWXU - 至关因而S_IRUSR,S_IWUSR,S_IXUSR的OR运算的值
stat.S_IRGRP - 设置组读权限位
stat.S_IWGRP - 设置组写权限位
stat.S_IXGRP - 设置组执行权限位
stat.S_IRWXG - 至关因而S_IRGRP,S_IWGRP,S_IXGRP的OR运算的值
stat.S_IROTH - 设置其余用户的读权限
stat.S_IWOTH - 设置其余用户的写权限
stat.S_IXOTH - 设置其余用户的执行权限
stat.S_IRWXO - 至关因而S_IROTH,S_IWOTH,S_IXOTH的OR运算的值
os.chown(path, uid, gid)
设置文件的用户id和组id,和os.fchown()相似,区别是后者接受的是一个文件描述符。若是不须要修改,则在指定的id位置设置为-1。
os.lchmod(path, mode)
修改文件的权限属性,若是path指示的路径是一个符号连接,则只会做用于该符号连接自身,不会修改其链接的源文件。
os.lchown(path, uid, gid)
修改文件的uid和gid,和os.chown()函数功能同样,区别是若是path指示的路径是一个符号连接,则只会修改符号连接自身,不会修改其链接的源文件。
os.link(source, link_name)
给文件source建立一个硬链接link_name,至关于Linux中的不叫-s选项的ln命令。
os.listdir(path)
返回一个由path指定的目录中的全部文件组成的列表。返回的列表是没有通过排序的。而且返回的列表中不包含‘.’和‘..’这两项。这个是一个很实用的函数。
os.lstat(path)
stat()系列函数中的一个,若是path指定的是一个符号连接,则该函数只会处理该符号连接自身,不会处理该连接的源文件。
os.mkinfo(path[, mode])
建立一个FIFO有名管道,至关于Linux下C API中的mkfifo()系统调用。mode参数指定了有名管道建立时指定的权限。和os.pipe()相似,只不过os.pipe()建立的是一个无名管道,只能用于有亲缘关系的进程间通讯,而FIFO有名管道能够在两个没有任何亲缘关系的管道间通讯,只要指定path就能够了。关于Linux下管道的内容,能够参看 IPC-管道 。
os.mkdir(path[, mode])
建立一个名为path的目录,同时能够指定mode权限。当设置mode权限的时候,须要和系统中的umask掩码进行运算,最后才是目录的权限。若是mode没有指定,则其值为0777。若是将要建立的目录已经存在,则会抛出os.OSError异常。
os.makedirs(path[, mode])
递归地建立目录,和os.mkdir()函数相似,区别是该函数能够递归地建立多级目录。在建立过程当中,若是子目录已存在或者该目录没法建立,则会抛出一个OSError异常。
os.readlink(path)
读一个符号连接,返回一个字符串对象,表示符号连接的源文件的位置。返回的结果多是一个绝对路径,也多是一个相对路径。
os.remove(path)
删除一个文件,文件由path指定。若是path指定的是一个目录,则抛出一个OSError异常。在Unix下,该函数会先删除该文件名,若是该文件还在被别的进程使用,则该文件占据的空间仍是会被保留,知道没有进程使用这个文件。和os.unlink()的工做机制同样。
os.removedirs(path)
递归地删除目录,和os.rmdir()相似,区别是os.removedirs()能够删除非空目录。os.removedirs()尝试连续地删除每个在path中给定的父目录直到一个错误被抛出,可是该错误一般被忽略,由于这通常意味着这个父目录是非空的。例如:当path指定为“foo/bar/baz”的时候,先删除目录“foo/bar/baz”若是非空的话,而后删除“foo/bar”若是非空的话,最后删除“foo”若是该目录是空的。若是没法连续的删除给定的目录,则抛出一个OSError异常。
os.rename(src, dst)
对文件或目录进行重命名,若是dst指定的是一个目录,则会抛出一个OSError异常。在Unix系统中,若是dst是一个已经存在的文件,则会替换该文件若是权限容许的话。在一些Unix系统中可能会失败若是src和dst是在不一样的文件系统上。若是能够成功操做,则该操做是一个原子操做。
os.renames(old, new)
递归地对目录进行改名,也能够对文件进行改名。和os.rename()的区别是,该函数会自动建立全部的中间目录,在建立中间目录的过程当中,每建立好一个新目录后使用os.removedirs()删除对应的旧目录。
注意:这个函数可能会在建立新的目录结构的时候操做失败,若是在删除旧目录的过程当中出现删除权限问题。
os.rmdir(path)
删除path指定的空目录,若是目录非空,则抛出一个OSError异常。
os.stat(path)
获取path指定的路径的信息,功能等同于C API中的stat()系统调用。该函数是stat函数族中的一种,和前述的lstat(),fstat()函数相似,只不过stat()函数处理的是目录,并且遇到符号连接的时候是处理符号连接的源文件的,而不是符号连接自身。
os.symlink(source, link_name)
为源文件source建立一个符号连接link_name。
os.unlink(path)
删除一个path指定的文件,和os.remove()的工做机制同样。
os.utime(path, times)
修改文件的访问时间和修改时间。若是times参数为None,则设置文件的访问时间和修改时间为当前的时间。不然,若是times参数不为空,则times参数是一个二元组(atime, mtime),用于设置文件的访问时间和修改时间。
os.tempnam([dir[, prefix]])
返回一个独一无二的路径名做为临时文件的文件名。返回的路径名是一个绝对路径,该临时文件名的入口由dir参数指定,若是dir参数没有指定或者为None,则用通用的临时文件目录做为临时文件的目录。若是dir被指定,而且不是None,则prefix参数被用来做为建立的临时文件名的前缀。
os.tmpnam()
返回一个独一无二的路径名做为临时文件的文件名,该文件名被建立者通用的临时文件目录下。
注意:os.tmpnam()和os.tempnam()只是负责生产一个临时文件的路径名,而不负责文件的建立和删除。
os.walk(top, topdown = True, onerror = None, followlinks = False)
以自顶向下遍历目录树或者以自底向上遍历目录树,对每个目录都返回一个三元组(dirpath, dirnames, filenames)。
三元组(dirpath,dirnames,filenames):
dirpath - 遍历所在目录树的位置,是一个字符串对象
dirnames - 目录树中的子目录组成的列表,不包括("."和"..")
filenames - 目录树中的文件组成的列表
若是可选参数topdown = True或者没有指定,则其实目录的三元组先于其子目录的三元组生成(自顶向下生成三元组),若是topdown = False,则起始目录的三元组在其子目录的三元组生成后才生成(自底向上生成三元组)。
当topdown = True,os.walk()函数会就地修改三元组中的dirnames列表(多是使用del或者进行切片),而后再使用os.walk()递归地处理剩余在dirnames列表中的目录。这种方式有助于加快搜索效率,能够指定特殊的遍历顺序。当topdown = False的时候修改dirnames是无效的,由于在使用自底向上进行遍历的时候子目录的三元组是先于上一级目录的三元组建立的。
默认状况下,调用listdir()返回的错误会被忽略,若是可选参数oneerror被指定,则oneerror必须是一个函数,该函数有一个OSError实例的参数,这样能够容许在运行的时候即便出现错误的时候不会打断os.walk()的执行,或者抛出一个异常并终止os.walk()的运行。
默认状况下,os.walk()遍历的时候不会进入符号连接,若是设置了可选参数followlinks = True,则能够进入符号连接。
注意:当设置followlinks = True时,可能会出现循环遍历,由于符号连接可能会出现本身连接本身的状况,而os.walk()不会意识到这一点。
注意:若是传递过去的路径名是一个相对路径,则不会修改当前的工做路径。
使用os.walk遍历目录真的很方便:
#-*- coding:utf-8 -*- import os if __name__ == '__main__': try: '''traval and list all files and all dirs''' for root, dirs, files in os.walk('D:' + os.sep + 'Python27'): print '-------------------directory < ' + root + ' > --------------------------' for d in dirs: print d for f in files: print f except OSError, e: print os.strerror(e.errno)