os模块
官方解释:
os: 可以使用操作系统函数的方法
sys: 可以访问 由解释器使用或维护的变量 和 与解释器进行交互的函数。
os常用的方法:
os.remove(‘path/filename’) # 删除文件 os.rename(oldname, newname) # 重命名文件 os.walk() # 生成目录树下的所有文件名 os.chdir('dirname') # 改变目录 os.mkdir/makedirs('dirname') # 创建目录/多层目录 os.rmdir/removedirs('dirname') # 删除目录/多层目录 os.listdir('dirname') # 列出指定目录的文件 os.getcwd() # 取得当前工作目录 os.chmod() # 改变目录权限 os.path.basename(‘path/filename’) # 去掉目录路径,返回文件名 os.path.dirname(‘path/filename’) # 去掉文件名,返回目录路径 os.path.join(path1[,path2[,...]]) # 将分离的各部分组合成一个路径名 os.path.split('path') # 返回( dirname(), basename()) 元组 os.path.splitext() # 返回 (filename, extension) 元组 os.path.getatimectimemtime # 分别返回最近访问、创建、修改时间 os.path.getsize() # 返回文件大小 os.path.exists() # 是否存在 os.path.isabs() # 是否为绝对路径 os.path.isdir() # 是否为目录 os.path.isfile() # 是否为文件
示例:给定一个文件夹,找出文佳夹下所有的文件的路径
import os # 方法一:(面试要求不使用os.walk) def print_directory_contents(sPath): for sChild in os.listdir(sPath): sChildPath = os.path.join(sPath, sChild) if os.path.isdir(sChildPath): print_directory_contents(sChildPath) else: print(sChildPath) # 方法二:(使用os.walk) def print_directory_contents(sPath): for root, _, filenames in os.walk(sPath): for filename in filenames: print(os.path.abspath(os.path.join(root, filename))) print_directory_contents('D:Demo')
sys模块
sys常用的方法:
sys.argv # 命令行参数List,第一个元素是程序本身路径 sys.modules.keys() # 返回所有已经导入的模块列表 sys.exc_info() # 获取当前正在处理的异常类,exc_type、exc_value、exc_traceback # 当前处理的异常详细信息 sys.exit(n) # 退出程序,正常退出时exit(0) sys.hexversion # 获取Python解释程序的版本值,16进制格式如:0x020403F0 sys.version # 获取Python解释程序的版本信息 sys.maxint # 最大的Int值 sys.maxunicode # 最大的Unicode值 sys.modules # 返回系统导入的模块字段,key是模块名,value是模块 sys.path # 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform # 返回操作系统平台名称 sys.stdout # 标准输出 sys.stdin # 标准输入 sys.stderr # 错误输出 sys.exc_clear() # 用来清除当前线程所出现的当前的或最近的错误信息 sys.exec_prefix # 返回平台独立的python文件安装的位置 sys.byteorder # 本地字节规则的指示器,big-endian平台的值是'big',little-endian平台的值是'little' sys.copyright # 记录python版权相关的东西 sys.api_version # 解释器的C的API版本 sys.stdin,sys.stdout,sys.stderr
stdin , stdout , 以及stderr 变量包含与标准I/O 流对应的流对象. 如果需要更好地控制输出,而print 不能满足要求, 它们就是所需要的;
你也可以替换它们, 这时候你就可以重定向输出和输入到其它设备( device ), 或者以非标准的方式处理它们
import sys sys.stdout.write('HelloWorld!') print('Please enter yourname:') name = sys.stdin.readline()[:-1] print('Hi, %s!' % name)
常用print和raw_input来进行输入和打印,那么print 和 raw_input是如何与标准输入/输出流建立关系:其实Python程序的标准输入/输出/出错流定义在sys模块中,分别 为: sys.stdin,sys.stdout, sys.stderr
下列的程序也可以用来输入和输出是一样的,在Python运行环境中输入以下代码:
import sys for f in (sys.stdin, sys.stdout, sys.stderr): print(f) # 输出为: # <_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'> # <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> # <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>
由此可以看出stdin, stdout, stderr在Python中无非都是文件属性的对象,他们在Python启动时自动与Shell 环境中的标准输入,输出,出错关联。
而Python程序的在Shell中的I/O重定向与本文开始时举的DOS命令的重定向完全相同,其实这种重定向是由Shell来提供的,与Python 本身并无关系。那么我们可以在Python程序内部将stdin,stdout,stderr读写操作重定向到一个内部对象.
Python提供了一个StringIO模块来完成这个设想,比如:
from io import StringIO import sys buff = StringIO() temp = sys.stdout # 保存标准I/O流 sys.stdout = buff # 将标准I/O流重定向到buff对象 print(42, 'hello', 0.001) # 不打印 sys.stdout = temp # 恢复标准I/O流 print(buff.getvalue()) # 42 hello 0.001
总结:
os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;
sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。