(原创)Python文件与文件系统系列(2)——os模块对文件、文件系统操作的支持

  os模块的功能主要包括文件系统部分和进程管理部分,这里介绍其中与文件系统相关的部分。

  当请求操作系统执行操作失败时,os模块抛出内置异常 exceptions.OSError 的实例,可以通过 os.error 访问这个类型,OSError的实例有三种属性:

  • errno:操作系统错误的错误代码
  • strerror:描述错误的字符串;
  • filename:操作在哪个文件上出错。

 

1. os模块提供的有用属性:

1.1 curdir

>>> os.curdir
'.'

  表示当前目录的字符串,Unix和Windows上都是“.”。

 1.2 pardir

>>> os.pardir
'..'

  表示父目录的字符串,Unix和Windows上都是“..”。

 1.3 defpath

>>> os.defpath
'.;C:\\bin'

  程序的默认搜索路径,如果缺乏PATH环境变量时使用。

 1.4 linesep

>>> os.linesep
'\r\n'

  文本行的结尾字符串,Unix上是'\n',Windows上是'\r\n'。

 1.5 extsep

>>> os.extsep
'\r\n'

  分隔文件的扩展名和文件名的分隔符,Unix和Windows上都是“.”。

 1.6 pathsep

>>> os.pathsep
';'

  路径列表中用来分隔路径的分隔符,可以参考PATH环境变量,Unix平台上是“:”,Windows平台上是";"。

 1.7 sep

>>> os.sep
'\\'

  路径组成的分割符,在Unix平台上是"/",Windows平台上是"\\"。

 

2. os模块提供的与文件系统相关的方法

2.1 access(path, mode)

os.access(path, mode)
# e.g. 
>>> os.access("C:\Windows\System32", os.R_OK | os.W_OK)
True

  access()函数判断当前进程的真实用户(组)(real user / real group)是否具有对路径 path 执行所有 mode 中列出的操作的权限,参数mode的可选值包括:

  • os.F_OK:路径指定的文件是否存在;
  • os.R_OK:路径指定的文件是否可读;
  • os.W_OK:路径指定的文件是否可写;
  • os.X_OK:路径指定的文件是否可执行;

 2.2 chdir(path)

os.chdir(path)
# e.g.
>>> os.chdir("c:/")

  等于 cd 到路径path,即將pwd切換到 path 指定的路径。

2.3 chmod(path, mode)

os.chmod(path, mode)

  将 path 的访问权限设置为mode ,mode 可以是0或多个 os.R_OK,os.W_OK,os.X_OK,也可是3位8进制的整数(Unix平台),如 0777, 0664等。

 2.4 getcwd()

os.getcwd()
#e.g.
>>> os.getcwd()
'c:\\'

  getcwd()获取当前工作目录的路径。

 2.5 listdir(path)

os.listdir(path)

  listdir(path) 返回一个列表,列表中包括 path 路径下的所有文件和目录,但是不包括“.”和“..”目录。

  listdir()返回的列表是未排序的。

 2.6 mkdirs(path, mode), mkdir(path, mode)

os.mkdirs(path, mode=0777)
os.mkdir(path, mode=0777)

  创建一个目录,此时 path 可能涉及多级目录,mkdirs会创建沿路所有尚不存在的目录,然后设置访问权限;而 mkdir()只创建 path 最右端的 基地址,基地址前面如果存在尚未创建的目录,mkdir()会抛出异常OSError。

  创建失败时两个函数都抛出OSError,当指定的路径已经存在时也抛出相同的异常。

 2.7 remove(path), unlink(path)

os.remove(path)
os.unlink(path)

  这两个函数删除 path 指定的文件。

 2.8 removedirs(path)

os.removedirs(path)

  把 path 中经过的所有目录(要求是空的目录)都删除。

 2.9 rmdir(path)

os.rmdir(path)

  删除 path 指定的目录(要求目录为空),删除失败时抛出OSError,例如删除的目录非空。

 2.10 rename(src, dest)

os.rename(src, dest)

  将文件或目录 src 重命名为 dest。

  2.11 renames(src, dest)

os.renames(src, dest)

  重命名,但是重命名的过程中会自动创建参数 dest 中所有的尚不存在的中间路径,重命名后会删除 src 中包含的空目录。

 2.12 stat(path)

os.stat(path)

  返回一个 stat_result 类型的值,例如:

1 >>> mode = os.stat("test1.py")
2 >>> type(mode)
3 <type 'nt.stat_result'>
4 >>>
5 >>> mode
6 nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=
7 0, st_size=22L, st_atime=1439467351L, st_mtime=1439543082L, st_ctime=1439467351L
8 )

  可以看到stat()函数返回的 stat_result 对象的类型及一些信息,该对象提供了 10 种关于参数 path 的信息,可以通过对应的属性访问这些信息,例如查看文件的大小:

1 >>> os.path.getsize('test1.py')
2 0L
3 >>> os.stat('test1.py').st_size
4 0L

   这10种关于文件、目录的信息及其对应的属性名称分别为:

属性名 含义
st_mode 访问控制与其他模式位
st_ino I节点的序号
st_dev 设备号
st_nlink 硬链接数
st_uid 属主的UID
st_gid 属主的GID
st_size 大小(单位:字节)
st_atime 最后访问时间(自epoch以来的秒数)
st_mtime 最后修改时间
st_ctime 最后一次状态改变的时间

 2.13 utime(path, times)

os.utime(path, times=None)

  设置文件的最后访问和最后修改时间,

  • 如果 times 是None,则utime()使用当前的时间;
  • 如果 times 不为None,则 times 必须是一个二元组——(accessed, modified),即指定最后访问和修改的时间,这里这两个值都要是自 epoch 以来的秒数。

 2.14 walk(top, topdown, onerror)

os.walk(top, topdown=True, onerror=None)

  首先,这个函数是一个生成器!用来遍历参数 top 指定的目录

  • 当参数 topdown 为True(默认情形)时,从 top 向其子目录遍历
  • 当参数 topdown 为False时,倒序从 top 目录树的叶节点开始,反向遍历

  参数 onerror :

  • 如果是None,则walk()忽略遍历过程中遇到的一切OSError异常
  • 否则必须是一个函数,以异常OSError的实例为唯一的参数,一旦walk()遇到异常,就将其传递给 onerror()函数,onerror()可以自由定义。

  walk() 每次生成的 item 都是一个三元组——(dirpath, dirnames, filenames),其中:

  • dirpath:当前遍历到的目录的名称;
  • dirnames:列表,包含当前目录的所有直接子目录名(不包括 "." 和 "..");
  • filenames:列表,包含当前目录中的所有文件名;

例:

import os
for dirpath, dirnames, filenames in os.walk("d:\\programs"):
    dirnames[:] = [ d for d in dirnames if not d.startswith('.') ]
    for name in filenames:
        print os.path.join(dirpath, name)

 

  该例子将会打印出”d:\\programs“目录下,所有不以 “.” 开头的目录中的所有文件,

  注意在 topdown 为True时,遍历到一层目录时,修改生成得到的dirnames列表,可以影响下一层将要遍历的子目录个数和顺序,比如这里就在遍历时剔除了以“.”开头的目录。

posted @ 2015-08-14 17:55  王智愚  阅读(1239)  评论(0编辑  收藏  举报