17.3 os:可移植访问操作系统特定特性
os模块为平台特定的模块(如posix,nt和mac)提供了一个包装器。所以平台上函数的API都应当是相同的,所以使用os模块可以提供一定的可移植行。不过,并不是所以函数在每一个平台上都可用。具体来说,这个总结中介绍的许多进程管理函数就对Windows不适用。
os模块的Python文档的子标题是"杂类操作系统接口"。这个模块主要包括用于创建和管理运行进程或文件系统内容(文件和目录)的函数,只有很少一部分涉及其他功能。
17.3.1 检查文件系统内容
要准备文件系统上一个目录的内容列表,可以使用listdir()。
import os
import sys
print(os.listdir(sys.argv[1]))
返回值是一个列表,其中包含给定目录中的所有命名成员,这里不会区分文件、子目录和符号链接。
函数walk()会递归地遍历一个目录。对于每个子目录,它会生成一个tuple,其中包含目录路径、该路径的直接子目录以及一个列表,这个列表包含该目录中所有文件的文件名。
import os
import sys
# If we are not given a path to list, use /tmp.
if len(sys.argv) == 1:
root = '/tmp'
else:
root = sys.argv[1]
for dir_name,sub_dirs,files in os.walk(root):
print(dir_name)
# Make the subdirectory names stand out with /.
sub_dirs = [n + '/' for n in sub_dirs]
# Mix the directory contents together.
contents = sub_dirs + files
contents.sort()
# Show the contents,
for c in contents:
print(' {}'.format(c))
print()
该示例展示了一个递归目录列表。
如果除了文件名外还需要更多信息,那么scandir()可能比listdir()更高效,扫描目录时一个系统调用可以收集更多信息。
import os
import sys
for entry in os.scandir(sys.argv[1]):
if entry.is_dir():
typ = 'dir'
elif entry.is_file():
typ = 'file'
elif entry.is_symlink():
typ = 'link'
else:
typ = 'unknow'
print('{name} {typ}'.format(
name=entry.name,
typ=typ,
))
scandir()会为目录中的元素返回一个DirEntry实例序列。这个对象提供了很多属性和方法来访问文件的元数据。