跳转至

常用模块

Python 标准库(Python Standrad Library)中包含了大量有用的模块,同时也是每个标准的 Python 安装包中的一部分。熟悉 Python 标准库十分重要,因为只要你熟知这些库可以做到什么事,许多问题都能够轻易解决。

我们将探索这个库中的一些常用模块。你能在你的 Python 安装包中附带的文档中的“库概览(Library Reference)” 部分中查找到所有模块的全部细节。

让我们来了解一些有用的模块。

熟练掌握官方常用的内置模块,可以让你的代码事半功倍。


sys 模块

sys 模块包括了一些针对特定系统的功能。我们已经了解过 sys.argv 列表中包括了命令行参数。

想象一些我们需要检查正在使用的 Python 软件的版本,sys 模块会给我们相关的信息。

>>> import sys
>>> sys.version_info
sys.version_info(major=3, minor=5, micro=1, releaselevel='final', serial=0)
>>> sys.version_info.major == 3
True

它是如何工作的

sys 模块包含一个 version_info 元组,它提供给我们版本信息。第一个条目是主版本信息。我们可以调出这些信息并使用它。


日志模块

如果你想将一些调试(Debugging)信息或一些重要的信息储存在某个地方,以便你可以检查你的程序是否如你所期望那般运行,应该怎么做?你应该如何将这些信息“储存在某个地方”?这可以通过 logging 模块来实现。

保存为 stdlib_logging.py

import os
import platform
import logging

if platform.platform().startswith('Windows'):
    logging_file = os.path.join(os.getenv('HOMEDRIVE'),
                                os.getenv('HOMEPATH'),
                                'test.log')
else:
    logging_file = os.path.join(os.getenv('HOME'),
                                'test.log')

print("Logging to", logging_file)

logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s : %(levelname)s : %(message)s',
    filename=logging_file,
    filemode='w',
)

logging.debug("Start of the program")
logging.info("Doing something")
logging.warning("Dying now")

输出:

$ python stdlib_logging.py
Logging to /Users/swa/test.log

$ cat /Users/swa/test.log
2014-03-29 09:27:36,660 : DEBUG : Start of the program
2014-03-29 09:27:36,660 : INFO : Doing something
2014-03-29 09:27:36,660 : WARNING : Dying now

如果你不能运行 cat 命令,你可以通过一款文本编辑器打开 test.log 文件。

它是如何工作的

我们使用了三款标准库中的模块——os 模块用以和操作系统交互,platform 模块用以获取平台——操作系统——的信息,logging 模块用来记录(Log)信息。

首先,我们通过检查 platform.platform() 返回的字符串来确认我们正在使用的操作系统(有关更多信息,请参阅import platform; help(platform))。如果它是 Windows,我们将找出其主驱动器(Home Drive),主文件夹(Home Folder)以及我们希望存储信息的文件名。将这三个部分汇聚到一起,我们得到了有关文件的全部位置信息。对于其它平台而言,我们需要知道的只是用户的主文件夹位置,这样我们就可获得文件的全部位置信息。

我们使用 os.path.join() 函数来将这三部分位置信息聚合到一起。使用这一特殊函数,而非仅仅将这几段字符串拼凑在一起的原因是这个函数会确保完整的位置路径符合当前操作系统的预期格式。

然后我们配置 logging 模块,让它以特定的格式将所有信息写入我们指定的文件。

最后,无论这些信息是用以调试,提醒,警告甚至是其它关键的消息,我们都可以将其聚合并记录。一旦程序开始运行,我们可以检查这一文件,从而我们便能知道程序运行过程中究竟发生了什么,哪怕在用户运行时什么信息都没有显示。


os模块

os模块是与操作系统交互的一个接口

类型 描述
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2') 可生成多层递归目录
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename("oldname","newname") 重命名文件/目录
os.stat('path/filename') 获取文件/目录信息
os.sep 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command") 运行shell命令,直接显示
os.environ 获取系统环境变量
os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分割成目录和文件名二元组返回
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是绝对路径,返回True
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所指向的文件或者目录的最后修改时间

re模块

re(regular expression)就是正则表达式英文的缩写,也就是说python利用正则进行一些查找,替换等工作。将在之后的章节细细讲来。


time和datatime模块

在Python中标识时间共有3种方式,3者之间通过函数可以相互转换:

  • 时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。
  • 格式化的时间字符串
  • 元组(struct_time)   :struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时)
import time

# 1.时间戳(timestamp)
# 返回当前时间的时间戳(以秒计算,从1970年1月1日00:00:00开始到现在的时间差)
print(time.time())

# 2.元组(struct_time)
# 将一个时间戳转换为当前时区
t = time.localtime()
print(t)
# time.struct_time(tm_year=2020, tm_mon=7, tm_mday=16, tm_hour=12, tm_min=58, tm_sec=22, tm_wday=3, tm_yday=198, tm_isdst=0)
year = t.tm_year
month = t.tm_mon
#gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time ,中国 与 UTC的 tm_hour 相差8个时区单位
print(time.gmtime())
#time.struct_time(tm_year=2020, tm_mon=7, tm_mday=16, tm_hour=4, tm_min=58, tm_sec=22, tm_wday=3, tm_yday=198, tm_isdst=0)

#3.格式化的时间字符串
print(time.strftime("%Y-%m-%d %X",time.localtime())) 
#2020-07-16 13:01:56
print(time.strptime("2020:11:11:00:00:00","%Y:%m:%d:%X"))
#time.struct_time(tm_year=2020, tm_mon=11, tm_mday=11, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=316, tm_isdst=-1)

datetime常用方法:

import time,datetime
# 使用datetime和time获取当前时间
now1 = datetime.datetime.now()
now2=time.strftime('%Y-%m-%d %H:%M:%S')
print(now1)
print(now2)
now = datetime.datetime.now()
d1 = now - datetime.timedelta(hours=1)#获取前一小时
d2 = now - datetime.timedelta(days=1)#获取前一天
print(now)
print(d1)

输出:

2020-07-16 13:04:32.523358
2020-07-16 13:04:32
2020-07-16 13:04:32.523473
2020-07-16 12:04:32.523473

使用datetime获取代码执行的时长

import time,datetime
# 使用时间戳获取代码执行时间
s_time = time.time()
for i in range(0,3):
  time.sleep(1)
e_time=time.time()

print('代码运行时间是:',e_time - s_time)
#代码运行时间是: 3.001534938812256

random

随机生成内容(非常重要)

import random

#0,1之间时间生成的浮点数  float
print(random.random())

#随机生成传入参数范围内的数字
print(random.randint(1, 10))

#随机生成传入参数范围内的数字
print(random.randrange(1, 10))

#随机选择任意一个数字
print(random.choice([1, '0', [0, 1]]))

#随机选择任意两个数字
print(random.sample([1, '0', [0, 1]], 2))

生成一个随机验证码:

import random

def v_code(length):
    ret = ""
    for i in range(length):
        num = random.randint(0,9)
        #字符ASCII码是从65-122的大小写字母,通过chr函数,由ASCII码数字转为字母
        rchar = chr(random.randint(65,122))
        #字母与数字随机拼接
        num_rchar = str(random.choice([num,rchar]))
        ret +=num_rchar
    return ret

print(v_code(10))

collections

集合模块,跳转吧,少年,没有比官网更好的文档了:

collections --- 容器数据类型

类型 描述
namedtuple() 创建命名元组子类的工厂函数
deque 类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)
ChainMap 类似字典(dict)的容器类,将多个映射集合到一个视图里面
Counter 字典的子类,提供了可哈希对象的计数功能
OrderedDict 字典的子类,保存了他们被添加的顺序
defaultdict 字典的子类,提供了一个工厂函数,为字典查询提供一个默认值
UserDict 封装了字典对象,简化了字典子类化
UserList 封装了列表对象,简化了列表子类化
UserString 封装了列表对象,简化了字符串子类化

例如,笔者最常用的namedtuple,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数

from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(11, y=22)
x, y = p

json模块

json是一种通用的数据类型,互联网最常用的数据传输类型,API接口返回的数据类型基本都是json

函数 描述
json.dumps 将 Python 对象编码成 JSON 字符串
json.loads 将已编码的 JSON 字符串解码为 Python 对象

python 原始类型向 json 类型的转化对照表:

Python类型 Json类型
dict object
list, tuple array
str, unicode string
int, long, float number
True true
False false
None null

json.dumps

import json

data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]

json = json.dumps(data)
print json

结果为:

[{"a": 1, "c": 3, "b": 2, "e": 5, "d": 4}]

json.loads

import json

jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

text = json.loads(jsonData)
print(text)

结果为:

{u'a': 1, u'c': 3, u'b': 2, u'e': 5, u'd': 4}

Pickle

Python 提供了一个叫作 Pickle 的标准模块,通过它你可以将_任何_纯 Python 对象存储到一个文件中,并在稍后将其取回。这叫作持久地(Persistently)存储对象。

案例(保存为 io_pickle.py):

import pickle

# 我们存储相关对象的文件的名称
shoplistfile = 'shoplist.data'
# 需要购买的物品清单
shoplist = ['apple', 'mango', 'carrot']

# 准备写入文件
f = open(shoplistfile, 'wb')
# 转储对象至文件
pickle.dump(shoplist, f)
f.close()

# 清除 shoplist 变量
del shoplist

# 重新打开存储文件
f = open(shoplistfile, 'rb')
# 从文件中载入对象
storedlist = pickle.load(f)
print(storedlist)

输出:

$ python io_pickle.py
['apple', 'mango', 'carrot']

它是如何工作的

要想将一个对象存储到一个文件中,我们首先需要通过 open 以写入(write)二进制(binary)模式打开文件,然后调用 pickle 模块的 dump 函数。这一过程被称作 封装(Pickling)

接着,我们通过 pickle 模块的 load 函数接收返回的对象。这个过程被称作 拆封(Unpickling)


Shelve

Shelve是对象持久化保存方法,将对象保存到文件里面,缺省(即默认)的数据存储文件是二进制的。

import shelve
list1 = [1,2,3]
output = shelve.open('sv.dat')
output['lst'] = list1
output.close()

import shelve
input = shelve.open('sv.dat')
list2 = input['lst']
print(list2)
input.close()
#输出[1,2,3]

总结

我们已经探索了 Python 标准库中提供的诸多的模块的一些功能。在此强烈建议你浏览 Python 标准库文档来了解所有可以使用的模块。

接下来,我们将介绍 Python 的其它各个方面,让我们的 Python 之旅更加_完整_。


参考链接: