#yyds干货盘点# os 库 sys 库getopt 库 与 filecmp 库,5000 字长文带你搞定四大库
Posted 梦想橡皮擦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点# os 库 sys 库getopt 库 与 filecmp 库,5000 字长文带你搞定四大库相关的知识,希望对你有一定的参考价值。
十四、sys 库、os 库、 getopt 库 与 filecmp 库
14.1 os 库
在 Python 中 os 库提供了基本的操作系统交互功能,该库下包含大量与文件系统、操作系统相关的函数,通过 dir
函数可以查看。
[DirEntry, F_OK, MutableMapping, O_APPEND, O_BINARY, O_CREAT, O_EXCL, O_NOINHERIT, O_RANDOM, O_RDONLY, O_RDWR, O_SEQUENTIAL, O_SHORT_LIVED, O_TEMPORARY, O_TEXT, O_TRUNC, O_WRONLY, P_DETACH, P_NOWAIT, P_NOWAITO, P_OVERLAY, P_WAIT, PathLike, R_OK, SEEK_CUR, SEEK_END, SEEK_SET, TMP_MAX, W_OK, X_OK, _Environ, __all__, __builtins__, __cached__, __doc__, __file__, __loader__, __name__, __package__, __spec__, _execvpe, _exists, _exit, _fspath, _get_exports_list, _putenv, _unsetenv, _wrap_close, abc, abort, access, altsep, chdir, chmod, close, closerange, cpu_count, curdir, defpath, device_encoding, devnull, dup, dup2, environ, error, execl, execle, execlp, execlpe, execv, execve, execvp, execvpe, extsep, fdopen, fsdecode, fsencode, fspath, fstat, fsync, ftruncate, get_exec_path, get_handle_inheritable, get_inheritable, get_terminal_size, getcwd, getcwdb, getenv, getlogin, getpid, getppid, isatty, kill, linesep, link, listdir, lseek, lstat, makedirs, mkdir, name, open, pardir, path, pathsep, pipe, popen, putenv, read, readlink, remove, removedirs, rename, renames, replace, rmdir, scandir, sep, set_handle_inheritable, set_inheritable, spawnl, spawnle, spawnv, spawnve, st, startfile, stat, stat_result, statvfs_result, strerror, supports_bytes_environ, supports_dir_fd, supports_effective_ids, supports_fd, supports_follow_symlinks, symlink, sys, system, terminal_size, times, times_result, truncate, umask, uname_result, unlink, urandom, utime, waitpid, walk, write]
内容太多,通过截图查阅比较清晰。
这些函数主要分为几类。
- 路径操作:
os.path
子库,处理文件路径及信息; - 进程管理:启动系统中其它程序;
- 环境参数:获得系统软硬件信息等环境参数。
14.1.1 os 库路径操作
os.path
在 os 库中用于提供操作和处理文件路径相关函数,常见的函数清单如下:
函数名 | 简介 |
---|---|
os.path.abspath(path) | 返回绝对路径 |
os.path.normpath(path) | 规范 path 字符串形式 |
os.path.realpath(path) | 返回 path 的真实路径 |
os.path.dirname(path) | 返回文件路径 |
os.path.basename(path) | 返回文件名 |
os.path.join(path1[, path2[, ...]]) | 把目录和文件名合成一个路径 |
os.path.exists(path) | 如果路径 path 存在,返回 True;如果路径 path 不存在,返回 False。 |
os.path.isfile(path) | 判断路径是否为文件 |
os.path.isdir(path) | 判断路径是否为目录 |
os.path.getatime(path) | 返回最近访问时间(浮点型秒数) |
os.path.getmtime(path) | 返回最近文件修改时间 |
os.path.getsize(path) | 返回文件大小,如果文件不存在就返回错误 |
以上函数的使用过程比较容易理解,导入模块之后,调用即可。
模块导入使用下述方式:
import os.path
# import os.path as op
variate = os.path.abspath(__file__)
print(variate)
函数的参数都是 path
,在传入的时候,特备要注意原生字符串的应用,还有要区分绝对路径和相对路径的问题。
由于 path 相关的库比较简单,每个内容都尝试一遍即可掌握,其它内容可以在 手册 进行学习。
14.1.2 os 库进程管理
该内容主要用于在 Python 中执行程序或命令 Command,函数原型为:
os.system(command)
例如,在 Python 中唤醒画板程序。
os.system("c:\\windows/system32/mspaint.exe")
除了 system
函数以外,还有一个 os.exec
函数族相关知识。具体可以查看下述函数的用法:
这些函数都将执行一个新程序,以替换当前进程。
14.1.3 os 库运行环境相关参数
环境参数顾名思义就是改变系统环境信息,或者理解为 Python 运行环境相关信息。
通过下述属性,可以获取环境变量:
os.environ
如果希望获取操作系统类型,使用 os.name
,目前只有 3 个值:分别是 posix , nt , java
函数部分,主要掌握的函数有:
os.chdir(path)
:修改当前程序操作的路径;os.getcwd()
:返回程序运行的路径;os.getlogin()
:获取当前登录用户名称;os.cpu_count()
:获得当前系统的 CPU 数量;os.urandom(n)
:返回一个有 n 个 byte 长的一个随机字符串,用于加密运算。
14.2 sys 库
该库主要维护一些与 Python 解释器相关的参数变量和方法。
14.2.1 常见属性如下
sys.argv
获取命令行参数列表,第一个元素是程序本身。
使用方式如下:
import sys
print(sys.argv)
接下来通过控制台运行 python 程序时,需要携带参数,下述代码 312.py
是 python 文件名,1
、2
、3
是后缀的参数。
python 312.py 1 2 3
执行程序之后,得到的结果为:
[312.py, 1, 2, 3]
第一个是文件名,后面依次是传递进来的参数。
sys.platform
获取 Python 运行平台的信息,结果比 os.name
要准确。
sys.path
获取 PYTHONPATH
环境变量的值,一般用作模块搜索路径。
import sys
print(sys.path)
sys.modules
以字典的形式获取所有当前 Python 环境中已经导入的模块。
sys.stdin,sys.stdout,sys.stderrsys.stdin
, sys.stdout
,sys.stderr
变量包含与标准 I/O 流对应的流对象。
import sys
# 标准输出, sys.stdout.write() 的形式就是 print() 不加\\n 的形式。
sys.stdout.write("hello")
sys.stdout.write("world")
sys.stdin
标准输入,等价于 input
。
sys.ps1 和 sys.ps2
指定解释器的首要和次要提示符。仅当解释器处于交互模式时,它们才有定义。具体测试如下:
PS > python
Python 3.7.3 (v3.7.3:xxxxxx, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.ps1
>>>
>>> sys.ps1 = "***"
***print("hello")
hello
14.2.2 常见方法如下
sys.exit(n)
退出 Python 程序,exit(0)表示正常退出。
当参数非 0 时,会引发一个 SystemExit
异常,可以在程序中捕获该异常。参数也可以称为状态码。
sys.getdefaultencoding()、sys.setdefaultencoding() 、sys.getfilesystemencoding()
sys.getdefaultencoding()
:获取系统当前编码,有的博客中写默认为ascii
,但是我本地默认为utf-8
;sys.setdefaultencoding()
:设置系统的默认编码;sys.getfilesystemencoding()
:获取文件系统使用编码方式,默认utf-8
。
sys.getrecursionlimit() 、 sys.setrecursionlimit()
获取 Python 的最大递归数目和设置最大递归数目
sys.getswitchinterval()、sys.setswitchinterval(interval)
获取和设置解释器的线程切换间隔时间(单位为秒)
还有很多方法,也是记忆层面的知识,备注下备注下 官方手册 地址。
14.3 getopt 库
在控制台运行命令的时候,存在一种需求是传递参数,例如安装第三方模块,使用的命令是:
pip install xxxx -i http://xxxxxx
在 Python 中也可以实现类似的效果,getopt
库提供了解析命令行参数 sys.argv
的功能。
通过 dir
查看该库中提供的方法不多,具体如下:
do_longs, do_shorts, error, getopt, gnu_getopt, long_has_args, os, short_has_arg
重点函数是 getopt.getopt()
该函数原型如下:
getopt(args, shortopts, longopts=[])
args
:程序的命令行参数,不包括程序文件名称,一般传递sys.argv[1:]
;shortopts
:定义-x
或者-x <值>
形式的短参数,带值的增加:
,例如xyz:m:
,表示可解析-x -y -z <值> -d <值>
的参数;longopts
:定义--name
,--name <值>
形式的长参数,带值的增加=
。
下面通过一个列表直接模拟 sys.argv
接收到的参数。
import getopt
import sys
sys.argv = ["demo.py", "-i", "-d", "baidu.com", "arg1"]
opts, args = getopt.getopt(sys.argv[1:], "id:")
print(opts)
print(args)
返回值由两个元素组成:第一个是 (option, value)
对的列表;
第二个是在去除该选项列表后余下的程序参数列表(这也就是 args 的尾部切片)。
除了短参数以外,还有长参数,测试代码如下:
my_str = "demo.py -i -d baidu.com --name bai arg1"
sys.argv = my_str.split()
print(sys.argv)
opts, args = getopt.getopt(sys.argv[1:], "id:",["name="])
print(opts)
print(args)
运行代码之后,参数也成功的被解析了出来。
[demo.py, -i, -d, baidu.com, --name, bai, arg1]
[(-i, ), (-d, baidu.com), (--name, bai)]
[arg1]
如果程序异常,会出现参数解析错误,异常类为 getopt.GetoptError
。
my_str = "demo.py -i -d baidu.com --name bai arg1"
sys.argv = my_str.split()
print(sys.argv)
opts, args = getopt.getopt(sys.argv[1:], "id:")
print(opts)
print(args)
该代码由于没有匹配长参数,出现错误为:
getopt.GetoptError: option --name not recognized
14.4 filecmp 库
该库用来提供比较目录和文件的功能。
文件比较函数有 cmp()
、cmpfiles()
,
目录比较使用 filecmp 库中的 dircmp 类。
14.4.1 filecmp.cmp()、filecmp.cmpfiles()
filecmp.cmp() 用于比较两个文件内容是否一致,如果文件内容匹配,函数返回 True,否则返回 False。
import filecmp
x = filecmp.cmp("312.py","312.py")
print(x)
filecmp.cmpfiles() 函数用于比较两个文件夹内指定文件是否相等。
函数原型如下:
filecmp.cmpfiles(dir1, dir2, common[, shallow])
参数 dir1
, dir2
指定要比较的文件夹,参数 common
指定要比较的文件名列表。
函数返回包含 3 个 list 元素的元组,分别表示匹配、不匹配以及错误的文件列表。
错误的文件指的是不存在的文件,或文件被琐定不可读,或没权限读文件,或者由于其他原因访问不了该文件。
测试代码如下:
import filecmp
x = filecmp.cmpfiles("../53","../54",["demo.py","demo1.py"])
print(x)
14.4.2 目录比较
主要看类的构造函数就可以了。
class filecmp.dircmp(a, b, ignore=None, hide=None)
参数说明如下:
a, b
:目录;ignore
:关键字参数,需要忽略的文件名列表, 默认为filecmp.DEFAULT_IGNORES
;hide
:关键字参数,需要隐藏的文件名列表, 默认为[os.curdir, os.pardir]
。
使用 dircmp
生成一个比较对象之后,就可以获取各个属性值了。具体可以直接在这个网页进行查询。
14.5 这篇博客的总结
本篇博客学习了 Python 中 4 个常见库的基本使用,这些库的存在,使得 Python 编码效率大幅度的提升,很多时候,你无法解决的编程问题,都可以用 Python 内置的库快速解决,这也是 Python 的魅力所在 ,希望对你有所帮助。
以上是关于#yyds干货盘点# os 库 sys 库getopt 库 与 filecmp 库,5000 字长文带你搞定四大库的主要内容,如果未能解决你的问题,请参考以下文章
Vsphere创建内容库Iso以及创建esxi虚拟机 #yyds干货盘点#