【Python】 sys和os模块

时间:2021-09-27 04:55:54

sys

  sys模块能使程序访问于python解释器联系紧密的变量和函数

●  sys中的一些函数和变量

  argv  命令行参数构成的列表

  path  查找所有可用模块所在的目录名的列表

  platform  查看当前操作平台如win32,linux2之类的平台标识符

  stdin  标准输入流

  stdout  标准输出流

  stderr  标准错误流

  //这三个流是类文件对象,默认关联的文件是键盘,屏幕和屏幕

  modules  所有加载的模块,按模块类别分别"built_in":...,等 可用modules.keys()查看分类,import语句在import前都会检查这个字典看要加载的模块在不在里面

  *关于stdin,stdout,stderr

    他们本身有stdin.read和stdout.write&stderr.write来进行读写。//比如print语句总是自带换行,如果想不换行就可以sys.stdout.write("...")

    因为stdout的输出对象是屏幕,所以当stdout要写东西时,内容是输出在屏幕上的。如果在程序中让stdout = open("PATH","w"),相当于把默认的stdout输出到屏幕という設定改成输出到一个特定的文件。

    那么在此之后再来print "Hello",此时屏幕上已经看不到内容,而全部都在文件里了。

    同理,可以用stderr来生成程序层面的错误日志。

    ☆ 可以看到要让stdout重定向会让原来关联的屏幕设备弄不回来了。所以在这么做之前,一定要将原来的屏幕设备对象备份起来:

temp = stdout
stdout = open("testfile","w")
##########一些操作后
stdout = temp

    像这样,重定向完了之后一定要把屏幕重新关联到stdout

  

  exit    退出当前程序,并给出返回值

  exitfunc  指出退出时调用的函数,让sys.exitfunc = 函数名 来指定

  需要注意的是,sys中的变量大多与解释器和系统挂钩,所以对其进行分析或操作时千万记得要创建一个副本操作,否则可能影响其他东西

os

  os模块主要负责程序查看一些操作系统的信息。它提供一些普遍的操作系统的功能而与具体是什么操作系统无关。

●  一些os中的变量

    name  指出平台,若是windows系统则是nt,若是linux/unix系统是posix

    sep  路径分隔符,如linux上是'/'而windows上是'\'

    linesep  行终止符

●  一些os中的方法

    os.getcwd()  获取当前工作目录

    os.chdir(...)  改变工作目录

    os.listdir(...)  获得指定目录下的所有文件和子目录组成的列表

    os.rmdir(...)  删除(空)目录

    os.makedirs(...)  会递归创建目录

    os.remove(...)  删除一个文件

    os.system(...)  执行shell命令,其返回值就是命令执行的返回值(0为执行成功等)

    os.startfile(...)  打开某个程序,只有在windows下才可顺利执行

  在中文系统中,涉及文件及目录的时候通常会含有中文,在os中对中文的处理默认是unicode方式而不是某种编码的str,所以程序碰到中文时也尽量用unicode的方式来处理吧。

●  除此之外,os还有个子模块path下,有很多跟路径以及文件名相关的内容,如:

    os.path.split(...)  返回(目录路径,文件名)  相当于是把文件的完整的绝对路径拆分成了一个元组的两部分

    os.path.isfile(...)/isdir(...)  判断是否是文件或目录并且存在

    os.path.exists(...)  判断该路径是否存在

    os.path.getsize(...)  返回某个文件大小,若传进目录作为参数则大小为0

    os.path.splitext(...)  分离文件名和扩展名,即使文件有完整目录也把目录保留下来,比如splitext("D:\test.txt") ==> ("D:\test","txt")

    os.path.join(path,name)  连接目录和文件名

    os.basename(...)  传入一个绝对路径的话返回的是仅文件名的部分

    os.dirname(...)  和上面相反,返回文件所在目录的部分(不包括中间那个分隔符的)

    *可以说,除了少数几个像isfile,exists这样的方法外,其余os.path的方法都是只做了对路径处理的文字表面功夫,并不深究是否符合文件系统逻辑。

■   一些积累

●  os.walk(path)功能是遍历目录下所有内容,返回一个迭代器,其中包含了一些三元元组,每个元组的结构都是(dirpath,dirnames,filenames)

  dirpath:某个目录节点的路径表示(包括了该目录本身在内所有子目录节点)

  dirnames:该目录下所有子目录的列表

  filenames:该目录下所有文件组成的列表

  场景:比如说有个文件夹,要对其下以及其所有子目录下的所有文件做一个遍历,此时便可用walk,提取所有元组中的第三项,即每个目录节点下的文件的名字,以及第一项dirpath,将两者合并,便可得到每个文件的完整绝对路径了。

  

●  os.path.expanduser(path)

  可以将path中的"~"部分替换成当前用户的HOME文件夹,相当于是一个联系了环境变量的字符串替换工作

●  关于获取文件或目录的权限

  最近老是遇到要获取文件或目录权限的需求,然而自己写一个吧也就是截取文件或者目录权限的表示字符串再来判断什么的感觉很低级。现在发现可以这么解决:

  os里有一个os.stat("dir or file")的方法,返回一个stat对象,这个对象中就包含了这个文件或目录的很多信息,包括权限,所有者,大小,修改时间等等。可以说属性比较多比较万能的:

import os
stat = os.stat("testfile")
print stat.st_mode #33188,看不懂是因为这串数字是10进制的,必须要转化成8进制的数
print oct(stat.st_mode) #0100644,最后三位644说的就是他的权限啦

  除了st_mode还有st_uid , st_gid , st_size , st_a/c/mtime(是时间戳) 等等属性可以拿来用!

●  查看某个挂载点下的硬盘信息(Linux)

  os.statvfs('/'),返回一个statvfs_result对象。调用其中的信息可以给出一些关于硬盘的完整信息。

●  补充一下摘录自网上的一些os模块的方法(http://www.jb51.net/article/50070.htm)有重复的也不要吐槽。。:

os.sep 可以取代操作系统特定的路径分隔符。windows下为 '\\'
os.name 字符串指示你正在使用的平台。比如对于Windows,它是'nt',而对于Linux/Unix用户,它是 'posix'
os.getcwd() 函数得到当前工作目录,即当前Python脚本工作的目录路径
os.getenv() 获取一个环境变量,如果没有返回none
os.putenv(key, value) 设置一个环境变量值
os.listdir(path) 返回指定目录下的所有文件和目录名
os.remove(path) 函数用来删除一个文件
os.system(command) 函数用来运行shell命令
os.linesep 字符串给出当前平台使用的行终止符。例如,Windows使用 '\r\n',Linux使用 '\n' 而Mac使用 '\r'
os.path.split(path) 函数返回一个路径的目录名和文件名
os.path.isfile() 和os.path.isdir()函数分别检验给出的路径是一个文件还是目录
os.path.exists() 函数用来检验给出的路径是否真地存在
os.curdir 返回当前目录 ('.')
os.mkdir(path) 创建一个目录
os.makedirs(path) 递归的创建目录
os.chdir(dirname) 改变工作目录到dirname
os.path.getsize(name) 获得文件大小,如果name是目录返回0L
os.path.abspath(name) 获得绝对路径
os.path.normpath(path) 规范path字符串形式
os.path.splitext() 分离文件名与扩展名
os.path.join(path,name) 连接目录与文件名或目录
os.path.basename(path) 返回文件名
os.path.dirname(path) 返回文件路径
os.walk(top,topdown=True,onerror=None) 遍历迭代目录
os.rename(src, dst) 重命名file或者directory src到dst 如果dst是一个存在的directory, 将抛出OSError. 在Unix, 如果dst在存且是一个file, 如果用户有权限的话,它将被安静的替换. 操作将会失败在某些Unix 中如果src和dst在不同的文件系统中. 如果成功, 这命名操作将会是一个原子操作 (这是POSIX 需要). 在 Windows上, 如果dst已经存在, 将抛出OSError,即使它是一个文件. 在unix,Windows中有效。
os.renames(old, new) 递归重命名文件夹或者文件。像rename()