9.7 文件系统
对文件系统的访问大多通过Python的os模块实现。该模块是Python访问操作系统功能的主要接口。os模块实际上只是真正加载的模块的前端,而真正的那个“模块”明显要依赖与具体的操作系统。这个“真正”的模块可能是以下几种之一:posix (适用于Unix操作系统),nt (Win32), mac (旧版本的MacOS), dos (DOS), os2 (OS/2),等等。你不需要直接导入这些模块。只要导入os模块,Python会为你选择正确的模块,你不需要考虑底层的工作。根据你系统支持的特性,你可能无法访问到一些在其他系统上可用的属性。
除了对进程和进程运行环境进行管理外,os模块还负责处理大部分的文件系统操作,应用程序开发人员可能要经常用到这些。这些功能包括删除/重命名文件,遍历目录树,以及管理文件访问权限等。表9.5列出os模块提供的一些常见文件或目录操作函数。
另一个模块os.path可以完成一些针对路径名的操作。它提供的函数可以完成管理和操作文件路径名中的各个部分,获取文件或子目录信息,文件路径查询等操作。表9.6列出了 os.path中的几个比较常用的函数。
这两个模块提供了与平台和操作系统无关的统一的文件系统访问方法。例9.1 (ospathex.py)展示了os和os.path模块中部分函数的使用。
例9.1 os和 os.path模块例子(ospathex.py)
这段代码练习使用一些os和os.path模块中的功能。它创建一个文本文件,写入少量数据,然后重命名,输出文件内容。同时还进行了一些辅助性的文件操作,比如遍历目录树和文件路径名处理。
os的子模块os.path更多用于文件路径名处理。比较常用的属性列于表9.6中。在Unix平台下执行该程序,我们会得到如下输出:
在 DOS窗口下执行这个例子我们会得到非常相似的输出:
这里就不逐行解释这个例子了,我们把这个留给读者做练习。下面我们来看看一个类似的交互式例子(包括错误),我们会把代码分成几个小段,然后依次进行讲解。
代码的第一部分导入了 os模块(同时也包含os.path模块)。然后检查并确认 ‘/tmp’是一个合法的目录,并切换到这个临时目录开始我们的工作。之后我们用getcwd()方法确认我们当前位置。
接下来,我们在临时目录里创建了一个子目录,然后用listdir()方法确认目录为空(因为我们刚创建它)。第一次调用listdir()调用时出现的问题是因为我们没有传递要列目录的路径名。我们马上在第二次调用时修正了这个失误。
这里我们创建了一个有两行内容的test文件,之后列目录确认文件被成功创建。
这一段代码使用了 os.path的一些功能,包括我们之前看到过的 join()、isfile()、isdir()、split()、basename()和splitext(),我们还调用了 os下的rename()函数。接下来,我们显示文件的内容,之后,删除之前创建的文件和目录。
核心模块:os (和 os.path)
从上面这些长篇讨论可以看出,os和os.path模块提供了访问计算机文件系统的不同方法。我们在本章学习的只是文件访问方面,事实上 os模块可以完成更多工作。我们可以通过它管理进程环境,甚至可以让一个Python程序直接与另外一个执行中的程序“对话”。你很快就会发现自己离不开这个模块了。更多关于os模块的内容请参阅第14章。