Python 13 标准库-os和sys模块

Python 13 标准库-os和sys模块

旧博客Python系列

OS模块

OS模块提供了一系列与操作系统交互的方法,一般通常通过OS对操作系统的文件系统进行操作:

os.getcwd() 无参数,获取当前工作目录,即所执行程序的工作路径,返回一个字符串.
os.chdir(""dirname"") 就地改变当前脚本工作目录,传目录形式的字符串参数.成功则返回值为None.字符串可以传""..""这种相对路径以返回上一层,也可以用绝对路径
os.curdir 这是个属性,代表相对表示的当前目录,返回一个字符串"".""
os.pardir 这是个属性,返回当前目录的相对父目录,即字符串""..""
os.makedirs('dirname1/dirname2', mode=0o777, exist_ok=False)os.makedirs() 就地在当前工作目录下建立文件夹,传入字符串形式的路径参数,注意参数的目录分隔符是""/"",会递归建立目录.如果exist_ok设置为False,如果目录已经存在,会抛出OSError.如果设置为True则不会报错.
os.mkdir('dirname') 就地建立单层目录.dirname只传名称,不要传入分隔符
os.removedirs('dirname1/dirname2') 就地递归删除目录,从最深层的目录开始,如果删除一个目录后上一级目录为空,也会递归删除;如果不为空,则不会删除.如果找不到目录会报错,找到目录但未删除成功不会报错.这个方法返回None
os.rmdir('dirname'), 删除一层目录,如果找不到目录则报错,目录不为空也报错.
os.listdir('dirname') 以列表形式返回指定目录下所有文件和目录的名称,隐藏文件也包含.默认是当前目录.
os.remove(filename) 以字符串形式传入要删除的文件名,删除该文件.找不到文件或者文件被其他程序使用会报错.
os.rename(""oldname"",""newname"") 就地重命名文件或者目录.
os.stat('path/filename') 获取文件或目录信息.返回一个namedtuple对象,可以取里边的各个参数.
os.sep 一个属性,输出当前操作系统的路径分隔符,windows是'\\',linux是'/',是字符串格式.
os.linesep 一个属性,输出当前操作系统的换行符,windows下是'\r\n',linux下是'\n'
os.pathsep 一个属性,输出当前操作系统用于分割不同路径的分隔符,windows下是';',linux下是':'
os.name 一个属性,输出当前操作系统的平台,windows为'nt',linux为'posix'
os.system(""bash command"") 执行shell命令,在windows下相当于在cmd窗口下执行命令,linux相当于在默认的bash下执行.
os.environ 属性,获取系统参数,是一个类似字典的对象,可以取其中的变量名和值来看.
os.path.abspath(path) path变量表示一个路径名,可能包含最终的文件名,也可能只是目录.针对传入的字符串类型的文件名/目录名(相对绝对)均可,返回绝对路径,是一个字符串
os.path.split(path) 将传入的字符串路径分割成目录和文件名两个字符串,用两个变量同时接收即可.如果传入的是目录路径,则会拆成父目录与最后一个目录名
os.path.dirname(path) 返回传入的路径的目录部分,其实相当于os.path.split(path)的第一部分.如果对一个纯目录使用,返回这个目录的上一层目录
os.path.basename(path) 返回传入的路径的文件名部分,如果路径以os.sep结尾,则返回空值.其实相当于os.path.split(path)的第二部分.
os.path.exists(path) 判断path是否存在,存在返回True,不存在返回False,比较常用.
os.path.isabs(path) 判断是否是绝对路径,也比较常用
os.path.isfile(path) 如果path是一个存在的文件,就返回True.如果不存在,或者路径只是到目录,没有文件,则也返回False
os.path.isdir(path) 如果path仅仅是一个目录,则返回True,其他返回False
os.path.join(path1,[path2[,...]]) 用于路径拼接.注意如果第二个参数是绝对路径,之前的参数都会被忽略.最好是从其他函数传过来的东西进行拼接.
os.path.getatime(path) 返回path指向的文件夹或目录的最后存取时间
os.path.getmtime(path) 返回path指向的文件夹或目录的最后修改时间,这个也比较常用.

对os.path.split() os.path.dirname() os.path.basename()的测试

print('原始路径:')
a = os.getcwd()
b = os.getcwd() + '\\'
print(""A路径是: "", a)
print(""B路径是: "", b)
# 结果是:
# D:\Coding\Python\learning\bin
# D:\Coding\Python\learning\bin\
print(""-"" * 50)
print('split之后的路径:')
a_dir, a_file = os.path.split(a)
b_dir, b_file = os.path.split(b)
print('A路径分割后是: ', a_dir, '|', a_file)  # 切成了a当前目录的父目录与当前目录名
print('B路径分割后是: ', b_dir, '|', b_file)  # 切成了不带分隔符的当前目录路径,以及空字符串.
print(""-"" * 50)
print('用os.path.dirname()及os.path.basename 得到的结果:')
a_dir = os.path.dirname(a)
a_file = os.path.basename(a)
b_dir = os.path.dirname(b)
b_file = os.path.basename(b)
print('A路径的dirname是: {} | A路径的basename是 {}'.format(a_dir, a_file))  # 可见与split结果一致
print('B路径的dirname是: {} | B路径的basename是 {}'.format(b_dir, b_file))  # 可见与split结果一致

可见split的分割的核心控制点就是从右往左的第一个os.sep分隔符.上边代码的执行结果是:

原始路径:
A路径是:  D:\Coding\Python\learning\bin
B路径是:  D:\Coding\Python\learning\bin\
--------------------------------------------------
split之后的路径:
A路径分割后是:  D:\Coding\Python\learning | bin
B路径分割后是:  D:\Coding\Python\learning\bin | 
--------------------------------------------------
用os.path.dirname()及os.path.basename 得到的结果:
A路径的dirname是: D:\Coding\Python\learning | A路径的basename是 bin
B路径的dirname是: D:\Coding\Python\learning\bin | B路径的basename是

通过OS模块设置相对路径以调用自行编写的模块

在结构化程序设计里提到了按照目录编排模块之后,需要从目录里边的bin.py引入自行编写的与所在目录平级的模块目录内的内容,需要将模块目录设置进环境变量里,通常的代码如下:

if __name__ == ""__main__"":
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # 得到软件安装目录,也就是bin目录的父目录路径
    MODULE_DIR = os.path.join(BASE_DIR, 'lib')  # lib是自己定义的存放模块的目录,将lib路径添加到父目录路径上
    sys.path.append(MODULE_DIR)        #将模块目录加入到环境变量中,sys.path的操作都是临时添加.

import myfunction  # 之后就可以引入lib目录下自行编写的模块名称
myfunction.print_type('测试引入自己编写的模块函数.')  # 使用自行编写的模块内方法

OS的内容远不止上面这些与操作系统的文件系统交互的内容,还有很多和操作系统的其他模块进行交互的功能,具体可以看OS模块官方文档.

模块

如果说OS模块是和操作系统交互的话,sys模块实际上是和解释器的交互,可以获取一些解释器的设置及环境变量.sys的方法也有很多,以后遇到再补充进来:

sys.argv 这个是当程序通过python命令行执行(python bin.py)的时候,后边加的一系列参数被收集到argv列表内,列表的第一个元素是文件名(注意在pycharm下会自动加上路径名,在命令行下就是文件名),后边是以空格分割的参数.如果编写自己的可以在命令行下加参数的程序,这个非常有用.
sys.exit(n) 退出程序,n不赋值的话默认为0.学过C就知道,程序结束运行以后会返回结束码,0一般被认为是正常结束.可以通过此方法返回指定的值.例如指定10之后,pycharm的执行窗口就会显示 Process finished with exit code 10
sys.version 返回一个字符串,是python解释器的版本.
sys.maxsize 向解释器获取字长支持的最大整型值.32位系统上是2**32-1,64位系统是2**64-1
sys.path 获取环境变量,返回一个列表,列表的元素是path路径的各个字符串路径.可以支持列表的方法,append一个字符串路径,就可以将那个路径临时添加到环境变量中.想要永久添加,必须通过操作系统修改.
sys.platform 返回字符串,内容是操作系统平台.
sys.builtin_module_names 返回一个元组,元素是内建的模块名,这些模块名内建在解释器中,通过import导入的时候,这些名称最优先被选择.自行编写的模块不要与其发生命名冲突.
sys.stdout.write(""#"") 解释器环境的标准输出函数,将#输出到屏幕上,不像print默认会写一个换行.这个就和C和C++的stdout对象很相似,控制符全部要自己添加.这个其实是向缓冲区输出,用一个循环即可看到,缓存的内容在程序完成之前并没有一个一个的写,而是放完一起写入.需要写入的时候用flush()来刷新.查看print的命令可以知道,print将内容送入的也是标准输出对象,标准输出对象

模块示例

# 假如写了一个第一个参数是指令,第二个参数是路径的程序,在命令行下执行:
for i in sys.argv:
    print(i)
command = sys.argv[1]
path = sys.argv[2]

py1301.png

sys.stdout示例

#简易的进度条显示
for i in range(10):
    sys.stdout.write(""#"")
    time.sleep(0.5)
    sys.stdout.flush()  #如果没有flush,会在程序执行完毕的时候一次性将所有的#写到屏幕上.

os模块和sys模块通常用来对程序的运行环境(python程序其实是解释器启动的一个子程序)进行各种检测,能够得到关于操作系统和解释器的各种设置和变量,编写复杂的跨平台程序的时候,一般需要用到.

LICENSED UNDER CC BY-NC-SA 4.0
Comment