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 示例代码

  1. >>> import os
  2. >>> os.sep
  3. '/'
  4. >>> os.name
  5. 'posix'
  6. >>> os.getenv('PATH')
  7. '/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'
  8. >>> os.getcwd()
  9. '/Users/kwsy/PycharmProjects/pythonclass/mytest'

2. 目录操作

对文件夹进行增删改查操作

2.1 os.listdir()

获取指定目录下的所有文件和目录名,如果不指定目录,则目录默认为当前所在目录

  1. import os
  2. os.listdir()
  3. os.listdir('/Users/kwsy/')

2.1 os.mkdir()

创建一个目录(文件夹)

  1. import os
  2. os.mkdir('test')

2.2 os.rmdir()

删除一个目录,如果目录里有文件,则无法删除

  1. import os
  2. os.rmdir('test')

2.3 os.makedirs()

生成多层递归目录,这个方法与mkdir一样,都可以创建目录,不同之处在于mkdir只能创建一层目录,而makedirs可以创建多层。比如你想在目录A下创建一个目录B,用着两个方法都可以,但如果想在A目录下创建一个多层目录C/D/E, 就只能用os.makedirs().它会先创建C,然后在C下面创建D,在D下面创建E

  1. import os
  2. os.makedirs('test/demo/demo2')

2.4 os.removedirs()

递归删除多层目录,但若干目录中有文件则无法删除

  1. import os
  2. os.removedirs('test/demo/demo2')

2.5 os.chdir()

改变当前目录,切换到其他目录,和linux系统下的cd 命令是同样的效果

2.6 os.rename()

修改目录或者文件的名字

  1. import os
  2. os.rename('demo.py', 'demo2.py')

将文件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() 拼接路径

示例代码

  1. import os
  2. path = '/Users/kwsy/kwsy/coolpython/test.py'
  3. print(os.path.basename(path)) # 获取文件名
  4. print(os.path.dirname(path)) # 获取路径名
  5. print(os.path.getsize(path)) # 获取文件大小
  6. print(os.path.getatime(path)) # 获取最近访问时间
  7. print(os.path.getctime(path)) # unix是最新的元数据更改的时间,windows系统下是文件创建时间
  8. print(os.path.getmtime(path)) # 获取文件内容最近修改时间
  9. print(os.path.abspath(path)) # 获取绝对路径
  10. print(os.path.split(path)) # 分割路径
  11. print(os.path.splitext(path)) # 分割文件名,返回由文件名和扩展名组成的元组
  12. print(os.path.join('/Users/kwsy/kwsy/coolpython', 'test.py'))

程序输出结果

  1. test.py
  2. /Users/kwsy/kwsy/coolpython
  3. 707
  4. 1575863105.0
  5. 1575862477.0
  6. 1575862477.0
  7. /Users/kwsy/kwsy/coolpython/test.py
  8. ('/Users/kwsy/kwsy/coolpython', 'test.py')
  9. ('/Users/kwsy/kwsy/coolpython/test', '.py')
  10. /Users/kwsy/kwsy/coolpython/test.py

sys

1. sys.version

获取python的版本

  1. >>> import sys
  2. >>> sys.version
  3. '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的作用

  1. import sys
  2. sys.stdout = open('test', 'a')
  3. print('ok')

sys.stdout是标准输出流,上面的代码将标准输出流重定向到一个打开的文件中,这样print函数在执行时,就不会在终端输出内容,而是在将内容写入到文件中

3. sys.modules

sys.modules是一个全局字典,该字典是python启动后就加载在内存中。每当程序员导入新的模块,sys.modules将自动记录该模块。当第二次再导入该模块时,python会直接到字典中查找,从而加快了程序运行的速度

4. sys.path

获取指定模块搜索路径的列表,当你在程序中使用import关键字引入一个模块时,解释器会按照一定的顺序来查找这个模块

  1. 当前目录
  2. 如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
  3. 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/

模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录

5. sys.exit(n)

程序执行到代码末尾,解释器会自动退出,如果你希望中途退出程序,可以使用sys.exit()方法,n可以传入一个整数,你可以在主程序中捕获对sys.exit()的调用并获得这个n,一般0表示正常退出,其他为异常

  1. import sys
  2. def test():
  3. sys.exit(3)
  4. try:
  5. test()
  6. except SystemExit as e:
  7. print(e)

程序输出结果是 3

6. sys.argv

在外部向程序内部传递参数,定义一个名为test.py的脚本,内容如下

  1. import sys
  2. def my_print(content, count):
  3. for i in range(count):
  4. print(content)
  5. if __name__ == '__main__':
  6. print(sys.argv)
  7. content, count = sys.argv[1], int(sys.argv[2])
  8. my_print(content, count)

这段代码看起来有点怪怪的,sys.argv到底是什么东西,别急,要想理解这段代码,就必须在终端通过python命令来运行程序

  1. python3 test.py 接收参数 2

在使用python命令执行脚本时,脚本的后面还跟了两段内容,这就是在向程序传递运行时所需要的参数,sys.argv就是用来存储这个参数的
程序输出内容为

  1. ['test.py', '接收参数', '2']
  2. 接收参数
  3. 接收参数

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

random提供一系列方法可以让你获得随机数

1. random.randint(n,m)

生成n与m之前的随机整数,结果区间是[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中随机挑选出一个数据

  1. import random
  2. lst = [3, 4, 1, 6, 8]
  3. print(random.choice(lst))

5. random.sample(seq, k)

从序列seq中随机抽取k个数组成一个新的序列

  1. import random
  2. lst = [3, 4, 1, 6, 8]
  3. 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的顺序打乱

  1. import random
  2. lst = [3, 4, 1, 6, 8]
  3. random.shuffle(lst)
  4. print(lst)

hashlib

1. md5

hashlib提供了常用的摘要算法如MD5,SHA1等等,摘要算法又称散列算法,哈希算法。很多人把MD5说成是加密算法,这是极其不准确的,md5是散列算法,不是加密算法,你什么时候见过有人能把所谓“加密”的值解密成原文? 很多网站的密码都是经过md5散列处理的,为的是保护用户账号的安全,但太多的人就是喜欢用简单的密码,比如123456,而123456 经过MD5散列后的值永远是 e10adc3949ba59abbe56e057f20f883e ,于是黑客就通过撞库,得到了用户的密码,网上一些所谓“解密”MD5的网站,仅仅是收集了大量的散列后的值而已,不是解密,而是撞库

2. python3 里使用md5

  1. import hashlib
  2. string = "123456"
  3. m = hashlib.md5() # 创建md5对象
  4. m.update(string.encode(encoding='utf-8')) # update方法只接收bytes类型数据作为参数
  5. str_md5 = m.hexdigest() # 得到散列后的字符串
  6. print('MD5散列前为 :' + string)
  7. print('MD5散列后为 :' + str_md5)

程序输出结果

  1. MD5散列前为 123456
  2. MD5散列后为 e10adc3949ba59abbe56e057f20f883e

statistics

statistics 提供了一些计算数学统计量的函数,功能如下表所示

函数 功能
mean 算数平均值
harmonic_mean 调和平均值
median 中位数
median_low 数据的第一个中位数(总数为偶数时有两个中位数)
median_high 数据的第二个中位数
median_grouped 分组数据的中位数的均值
mode 离散数据的模式, 数据中最常见的值
pstdev 数据总体的标准差
pvariance 数据总体的方差
stdev 数据样本的标准差
variance 数据样本的方差

示例代码如下

  1. import statistics
  2. lst = [1, 4, 5, 7, 1, 3, 6, 9, 19]
  3. print(statistics.mean(lst)) # 算数平均值
  4. print(statistics.harmonic_mean(lst)) # 调和平均值
  5. print(statistics.median(lst)) # 中位数
  6. print(statistics.median_low(lst)) # 数据的第一个中位数(总数为偶数时有两个中位数)
  7. print(statistics.median_high(lst)) # 数据的第二个中位数
  8. print(statistics.median_grouped(lst)) # 分组数据的中位数的均值
  9. print(statistics.mode(lst)) # 离散数据的模式, 数据中最常见的值
  10. print(statistics.pstdev(lst)) # 数据总体的标准差
  11. print(statistics.pvariance(lst)) # 数据总体的方差
  12. print(statistics.stdev(lst)) # 数据样本的标准差
  13. 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种:

  1. uuid1(), 基于时间戳, 由MAC地址、当前时间戳、随机数生成,可以保证全球唯一性
  2. uuid2(), 基于分布式计算环境DCE,python中没有提供这个算法。
  3. uuid3(),计算名字和命名空间的MD5散列值,可以保证同一命名空间中不同名字的唯一性,和不同命名空间的唯一性,但同一命名空间的同一名字生成相同的uuid
  4. uuid4(), 由伪随机数得到,有一定的重复概率,该概率可以计算出来
  5. uuid5(),基于名字的SHA-1散列值, 算法与uuid3相同,不同的是使用 Secure Hash Algorithm 1 算法

uuid3() 和 uuid5() 不常用,工作中使用uuid1()和uuid() 就可以了

  1. import uuid
  2. print(uuid.uuid1())
  3. print(uuid.uuid3(uuid.NAMESPACE_DNS, 'coolpython'))
  4. print(uuid.uuid4())
  5. print(uuid.uuid5(uuid.NAMESPACE_DNS, 'coolpython'))