os
os模块提供了与操作系统相关的功能,本教程李,目录和文件夹是同一个意思。
1. 系统操作相关
1.1 os.sep
操作系统路径分隔符,在不同的操作系统上,路径分割符是不一样的。windows系统是\, linux系统和mac是/
1.2 os.name
获取正在使用的工作平台,windows下是nt,linux/unix环境下是posix
1.3 os.getenv()
1.4 os.getcwd()
1.5 示例代码
>>> import os>>> os.sep'/'>>> os.name'posix'>>> os.getenv('PATH')'/Library/Frameworks/Python.framework/Versions/3.6/bin:/usr/local/var/pyenv/shims:/opt/local/bin:/opt/local/sbin:/opt/local/sbin:/opt/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Users/kwsy/Qt5.5.0/5.5/clang_64/bin:/usr//bin/ChromeDriver:/Users/kwsy/.rvm/bin:/Users/kwsy/.rvm/bin:/usr/bin/:/Users/kwsy/rc_tool/rd_tools/arcanist/bin'>>> os.getcwd()'/Users/kwsy/PycharmProjects/pythonclass/mytest'
2. 目录操作
2.1 os.listdir()
获取指定目录下的所有文件和目录名,如果不指定目录,则目录默认为当前所在目录
import osos.listdir()os.listdir('/Users/kwsy/')
2.1 os.mkdir()
创建一个目录(文件夹)
import osos.mkdir('test')
2.2 os.rmdir()
删除一个目录,如果目录里有文件,则无法删除
import osos.rmdir('test')
2.3 os.makedirs()
生成多层递归目录,这个方法与mkdir一样,都可以创建目录,不同之处在于mkdir只能创建一层目录,而makedirs可以创建多层。比如你想在目录A下创建一个目录B,用着两个方法都可以,但如果想在A目录下创建一个多层目录C/D/E, 就只能用os.makedirs().它会先创建C,然后在C下面创建D,在D下面创建E
import osos.makedirs('test/demo/demo2')
2.4 os.removedirs()
递归删除多层目录,但若干目录中有文件则无法删除
import osos.removedirs('test/demo/demo2')
2.5 os.chdir()
改变当前目录,切换到其他目录,和linux系统下的cd 命令是同样的效果
2.6 os.rename()
修改目录或者文件的名字
import osos.rename('demo.py', 'demo2.py')
3. path模块
os.path提供了对文件和目录更加强大的操作
| 方法名 | 功能作用 |
|---|---|
| os.path.exists(path) | 判断path是否存在,path既可以是目录,也是是文件,如果存在返回True,反之返回False |
| os.path.isfile(path) | 判断path是否是文件,如果是返回True |
| os.path.isdir(path) | 判断path是否是目录,如果是返回True |
| os.path.isabs(path) | 判断路径是否是绝对路径 |
| os.path.basename(path) | 获取文件名 |
| os.path.dirname(path) | 获取路径名 |
| os.path.getsize(path) | 获取文件大小 |
| os.path.getatime(path) | 获取最近访问时间 |
| os.path.getctime(path) | unix是最新的元数据更改的时间,windows系统下是文件创建时间 |
| os.path.getmtime(path) | 获取文件内容最近修改时间 |
| os.path.abspath(path) | 获取绝对路径 |
| os.path.split(path) | 分割路径 |
| os.path.splitext(path) | 分割文件名,返回由文件名和扩展名组成的元组 |
| os.path.join() | 拼接路径 |
示例代码
import ospath = '/Users/kwsy/kwsy/coolpython/test.py'print(os.path.basename(path)) # 获取文件名print(os.path.dirname(path)) # 获取路径名print(os.path.getsize(path)) # 获取文件大小print(os.path.getatime(path)) # 获取最近访问时间print(os.path.getctime(path)) # unix是最新的元数据更改的时间,windows系统下是文件创建时间print(os.path.getmtime(path)) # 获取文件内容最近修改时间print(os.path.abspath(path)) # 获取绝对路径print(os.path.split(path)) # 分割路径print(os.path.splitext(path)) # 分割文件名,返回由文件名和扩展名组成的元组print(os.path.join('/Users/kwsy/kwsy/coolpython', 'test.py'))
程序输出结果
test.py/Users/kwsy/kwsy/coolpython7071575863105.01575862477.01575862477.0/Users/kwsy/kwsy/coolpython/test.py('/Users/kwsy/kwsy/coolpython', 'test.py')('/Users/kwsy/kwsy/coolpython/test', '.py')/Users/kwsy/kwsy/coolpython/test.py
sys
1. sys.version
获取python的版本
>>> import sys>>> sys.version'3.6.6 (v3.6.6:4cf1f54eb7, Jun 26 2018, 19:50:54) \n[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]'
2. sys.stdin, sys.stdin, sys.stderr
这三者是与解释器的标准输入,输出和错误流相对应的文件对象。关于这三个文件对象足以专门写一篇教程,这里只举一个例子来说明sys.stdout的作用
import syssys.stdout = open('test', 'a')print('ok')
sys.stdout是标准输出流,上面的代码将标准输出流重定向到一个打开的文件中,这样print函数在执行时,就不会在终端输出内容,而是在将内容写入到文件中
3. sys.modules
sys.modules是一个全局字典,该字典是python启动后就加载在内存中。每当程序员导入新的模块,sys.modules将自动记录该模块。当第二次再导入该模块时,python会直接到字典中查找,从而加快了程序运行的速度
4. sys.path
获取指定模块搜索路径的列表,当你在程序中使用import关键字引入一个模块时,解释器会按照一定的顺序来查找这个模块
- 当前目录
- 如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
- 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/
模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录
5. sys.exit(n)
程序执行到代码末尾,解释器会自动退出,如果你希望中途退出程序,可以使用sys.exit()方法,n可以传入一个整数,你可以在主程序中捕获对sys.exit()的调用并获得这个n,一般0表示正常退出,其他为异常
import sysdef test():sys.exit(3)try:test()except SystemExit as e:print(e)
6. sys.argv
在外部向程序内部传递参数,定义一个名为test.py的脚本,内容如下
import sysdef my_print(content, count):for i in range(count):print(content)if __name__ == '__main__':print(sys.argv)content, count = sys.argv[1], int(sys.argv[2])my_print(content, count)
这段代码看起来有点怪怪的,sys.argv到底是什么东西,别急,要想理解这段代码,就必须在终端通过python命令来运行程序
python3 test.py 接收参数 2
在使用python命令执行脚本时,脚本的后面还跟了两段内容,这就是在向程序传递运行时所需要的参数,sys.argv就是用来存储这个参数的
程序输出内容为
['test.py', '接收参数', '2']接收参数接收参数
sys.argv是一个列表,包含了脚本的名称后紧跟在脚本后面的参数
math
math模块提供了很多与数学相关的函数,本教程只列举了其中一部分。
| 方法名 | 功能和作用 |
|---|---|
| math.ceil(x) | 取大于等于x的最小的整数值,如果x是一个整数,则返回x |
| math.fabs(x) | 返回x的绝对值 |
| math.floor(x) | floor()取小于等于x的最大的整数值,如果x是一个整数,则返回自身 |
| log(x,a) | 如果不指定a,则默认以e为基数,a参数给定时,将 x 以a为底的对数返回 |
| math.log10(x) | 返回x的以10为底的对数 |
| math.log2(x) | 返回x的基2对数 |
| math.pi | 数字常量,圆周率 |
| math.pow(x, y) | 返回x的y次方,即x**y |
| math.sqrt(x) | 求x的平方根 |
random
1. random.randint(n,m)
2. random.random()
生成0到1之前的随机float数据,结果区间是[0.0, 1.0) ,左闭右开
3. random.uniform(a, b)
生成a 到b之前的随机float数据,结果区间是[a, b]
4. random.choice(seq)
从序列seq中随机挑选出一个数据
import randomlst = [3, 4, 1, 6, 8]print(random.choice(lst))
5. random.sample(seq, k)
从序列seq中随机抽取k个数组成一个新的序列
import randomlst = [3, 4, 1, 6, 8]print(random.sample(lst, 3))
6. random.randrange(start, stop, step)
生成一个从start到stop(不包括stop),间隔为step的一个随机整数,效果等价于random.choice(range(start, stop, step))
7. random.shuffle(seq)
将seq的顺序打乱
import randomlst = [3, 4, 1, 6, 8]random.shuffle(lst)print(lst)
hashlib
1. md5
hashlib提供了常用的摘要算法如MD5,SHA1等等,摘要算法又称散列算法,哈希算法。很多人把MD5说成是加密算法,这是极其不准确的,md5是散列算法,不是加密算法,你什么时候见过有人能把所谓“加密”的值解密成原文? 很多网站的密码都是经过md5散列处理的,为的是保护用户账号的安全,但太多的人就是喜欢用简单的密码,比如123456,而123456 经过MD5散列后的值永远是 e10adc3949ba59abbe56e057f20f883e ,于是黑客就通过撞库,得到了用户的密码,网上一些所谓“解密”MD5的网站,仅仅是收集了大量的散列后的值而已,不是解密,而是撞库
2. python3 里使用md5
import hashlibstring = "123456"m = hashlib.md5() # 创建md5对象m.update(string.encode(encoding='utf-8')) # update方法只接收bytes类型数据作为参数str_md5 = m.hexdigest() # 得到散列后的字符串print('MD5散列前为 :' + string)print('MD5散列后为 :' + str_md5)
程序输出结果
MD5散列前为 :123456MD5散列后为 :e10adc3949ba59abbe56e057f20f883e
statistics
statistics 提供了一些计算数学统计量的函数,功能如下表所示
| 函数 | 功能 |
|---|---|
| mean | 算数平均值 |
| harmonic_mean | 调和平均值 |
| median | 中位数 |
| median_low | 数据的第一个中位数(总数为偶数时有两个中位数) |
| median_high | 数据的第二个中位数 |
| median_grouped | 分组数据的中位数的均值 |
| mode | 离散数据的模式, 数据中最常见的值 |
| pstdev | 数据总体的标准差 |
| pvariance | 数据总体的方差 |
| stdev | 数据样本的标准差 |
| variance | 数据样本的方差 |
示例代码如下
import statisticslst = [1, 4, 5, 7, 1, 3, 6, 9, 19]print(statistics.mean(lst)) # 算数平均值print(statistics.harmonic_mean(lst)) # 调和平均值print(statistics.median(lst)) # 中位数print(statistics.median_low(lst)) # 数据的第一个中位数(总数为偶数时有两个中位数)print(statistics.median_high(lst)) # 数据的第二个中位数print(statistics.median_grouped(lst)) # 分组数据的中位数的均值print(statistics.mode(lst)) # 离散数据的模式, 数据中最常见的值print(statistics.pstdev(lst)) # 数据总体的标准差print(statistics.pvariance(lst)) # 数据总体的方差print(statistics.stdev(lst)) # 数据样本的标准差print(statistics.variance(lst)) # 数据样本的方差
uuid
uuid 是通用唯一识别码,它通过MAC地址、时间戳、命名空间、随机数、伪随机数来保证生成ID的唯一性,理论上,在这个宇宙中不可能生成两个相同的uuid。在分布式系统中,你可以用uuid来唯一的表示一个元素,不需要中央控制端来做标识的统一分配,任何一台机器上都可以大胆放心的生成uuid。
在很多系统里,uuid都有应用,比如微软的 Microsoft’s Globally Unique Identifiers (GUIDs),Linux ext2/ext3 档案系统。我在工作中也曾用到过,在于其他web服务交互时,使用uuid作为一次请求的唯一标识,在日志中记录下来,这样就可以通过uuid来串联起两个系统的调用链路信息。
uuid的算法有5种:
- uuid1(), 基于时间戳, 由MAC地址、当前时间戳、随机数生成,可以保证全球唯一性
- uuid2(), 基于分布式计算环境DCE,python中没有提供这个算法。
- uuid3(),计算名字和命名空间的MD5散列值,可以保证同一命名空间中不同名字的唯一性,和不同命名空间的唯一性,但同一命名空间的同一名字生成相同的uuid
- uuid4(), 由伪随机数得到,有一定的重复概率,该概率可以计算出来
- uuid5(),基于名字的SHA-1散列值, 算法与uuid3相同,不同的是使用 Secure Hash Algorithm 1 算法
uuid3() 和 uuid5() 不常用,工作中使用uuid1()和uuid() 就可以了
import uuidprint(uuid.uuid1())print(uuid.uuid3(uuid.NAMESPACE_DNS, 'coolpython'))print(uuid.uuid4())print(uuid.uuid5(uuid.NAMESPACE_DNS, 'coolpython'))
