10. 标准库简介
10.1 操作系统接口
os 模块是关于与操作系统交互的模块:
Test.py:
import os
#获取当前工作目录
print(os.getcwd())
#改变当前工作目录
os.chdir("/Users")
print(os.getcwd())
#使用命令行执行命令
os.system("echo 1233")
运行结果:
/Users/chenxiaowei/Desktop/VsCode-PythonWorkSpace
/Users
1233
还需要注意的是最好使用import os
而不要使用from os import *
因为这样会覆盖方法, 如open()和os.open()就很不同.
内置的dir()和help().
help():可以查看指定的模块的使用方式, 没有参数的话会进入help模式.
Test.py:
import os
help(os)
运行结果:
Help on module os:
NAME
os - OS routines for NT or Posix depending on what system we're on.
MODULE REFERENCE
https://docs.python.org/3.7/library/os
....
....
....
....
shutil模块用于更为方便的目录管理.
Test.py:
import shutil
import os
os.chdir("test")
print(os.getcwd())
shutil.copyfile("NewFile.txt", "11.txt")
shutil.move("NewFile.txt", "12.txt")
shutil.copyfile() : 用于复制文件
shutil.move() : 用于移动文件
10.2 文件通配符
glob 模块可用于在目录中使用通配符搜索返回文件列表的函数.
Test.py:
import glob
print(glob.glob("*.py"))
运行结果:
['Test.py', 'Main.py', 'Part.py']
10.3 命令行参数
使用命令行执行此main.py, 使用sys模块的argv查看参数.
Main.py:
import sys
print(sys.argv)
Commend:
chenxiaoweideMacBook-Pro:~ chenxiaowei$ python /Users/chenxiaowei/Desktop/VsCode-PythonWorkSpace/Main.py 1 2 3
运行结果:
['/Users/chenxiaowei/Desktop/VsCode-PythonWorkSpace/Main.py', '1', '2', '3']
argparse模块: argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生成帮助和使用信息.
参考: https://blog.csdn.net/qq_36653505/article/details/83788460
Main.py:
import argparse
#创建一个解析对象
parser = argparse.ArgumentParser(prog = 'top',
description = 'Show top lines from each file')
#向该对象中添加你要关注的命令行参数和选项
parser.add_argument('filenames', nargs='+')
parser.add_argument('-l', '--lines', type=int, default=10)
args = parser.parse_args()
print(args)
Commend:
chenxiaoweideMacBook-Pro:~ chenxiaowei$ python /Users/chenxiaowei/Desktop/VsCode-PythonWorkSpace/Main.py --lines=11 ss.txt pp.txt
Namespace(filenames=['ss.txt', 'pp.txt'], lines=11)
10.4 错误输出重定向和程序终止
sys模块有stdin, stdout, stderr等属性, 使用stdin可以定义输入是什么, stdout输出是什么, stderr 输出错误是什么, stdout默认是屏幕, 使用print()会将其输出到屏幕, 可以更改为文件, 将信息输出到文件里.
Test.py:
import sys
#保存默认输出到屏幕的方式.
temp = sys.stdout
sys.stdout = open("a.txt", "w")
sys.stdout.write("123411")
sys.stdout.close()
sys.stdout = temp
with open("a.txt", "r") as f:
print(f.read())
sys.stderr = temp
sys.stderr.write("test")
print("1")
sys.stderr = open("a.txt", "w")
sys.stderr.write("4321")
sys.stderr.close()
with open("a.txt", "r") as f:
print(f.read())
运行结果:
123411
test1
4321
可以使用sys.exit()
退出.
Test.py:
import sys
sys.exit()
print("没有输出则退出了")
运行结果:
10.5 字符串模式匹配
re 模块为高级字符串处理提供正则表达式工具.
re.findall()返回匹配表达式的列表.
Test.py:
import re
# \b: 用于匹配f开头的单词 [a-z]:匹配a-z *:前面的表达式0-任意次数
ansList = re.findall(r"\bf[a-z]*", "which foot or hand fell fastest")
print(ansList)
运行结果:
['foot', 'fell', 'fastest']
re.sub()是用于替换功能的函数.
Test.py:
import re
#匹配连续重复一次的字符串将其置换为一个.
print(re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat'))
运行结果:
cat in the hat cat
10.6 数学
math 模块.
Test.py:
import math
print(math.pi)
print(math.cos(1))
print(math.sin(1))
print(math.log(1024,2))
运行结果:
3.141592653589793
0.5403023058681398
0.8414709848078965
10.0
random 模块提供随机选择的功能.
random.choice() 从序列中随机选择一个数.
Test.py:
import random
myList = ["1", "2", "3", "4", "5"]
n = 3
while n:
ans = random.choice(myList)
print(ans)
n = n - 1
运行结果:
5
3
4
random.sample([], n) 从序列中随机选择n个.
Test.py:
import random
myList = ["1", "2", "3", "4", "5"]
print(random.sample(myList, 2))
运行结果:
['5', '3']
random.random() 随机返回一个float值.
Test.py:
import random
print(random.random())
运行结果:
0.048280080375733614
statistics 模块计算数值数据的基本统计属性.
使用statistics.mean()计算平均值.
Test.py:
import statistics
data = [1, 2, 3, 4, 5, 6]
ans = statistics.mean(data)
print(ans)
运行结果:
3.5
使用statistics.median()计算中位数, 当其为基数时返回中间那个, 当其为偶数个时返回中间二个数的平均数.
Test.py:
import statistics
data = [1, 2, 3, 4, 5, 1]
ans = statistics.median(data)
print(ans)
运行结果:
2.5
10.7 互联网访问
使用urllib.request检索数据.
Test.py:
from urllib.request import urlopen
with urlopen("http://www.baidu.com") as response:
for line in response:
line = line.decode("utf-8")
print(line)
运行结果:
#关于百度的html
.....
.....
.....
使用smtp发送邮件.
Test.py:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 第三方 SMTP 服务
mail_host="smtp.qq.com" #设置服务器
mail_user="xxxxx@qq.com" #用户名=qq邮箱
mail_pass="mniqkjvpwvuabsja" #口令
sender = 'xxxxx@qq.com'
receivers = ['xxxxx@qq.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("testFrom", 'utf-8')
message['To'] = Header("testTo", 'utf-8')
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
print("邮件发送成功")
except smtplib.SMTPException:
print("Error: 无法发送邮件")
运行结果:
邮件发送成功
10.8 日期和时间
datetime 模块提供了日期和时间的类.
Test.py:
from datetime import date
#获取今天的日期
now = date.today()
print(now)
#格式化输出日期
print(now.strftime("%Y年%m月%d日....."))
#定义一个日期
tempDate = date(2013, 12, 3)
print(tempDate)
#日期相减
apartDay = now - tempDate
print(apartDay.days)
运行结果:
2020-02-09
2020年02月09日.....
2013-12-03
2259
符号 | 含义 |
---|---|
%y | 两位数的年份表示(00-99) |
%Y | 四位数的年份表示(000-9999) |
%m | 月份(01-12) |
%d | 月内中的一天(0-31) |
%H | 24小时制小时数(0-23) |
%I | 12小时制小时数(01-12) |
%M | 分钟数(00=59) |
%S | 秒(00-59) |
%a | 本地简化星期名称 |
%A | 本地完整星期名称 |
%b | 本地简化的月份名称 |
%B | 本地完整的月份名称 |
%c | 本地相应的日期表示和时间表示 |
%j | 年内的一天(001-366) |
%p | 本地A.M.或P.M.的等价符 |
%U | 一年中的星期数(00-53)星期天为星期的开始 |
%w | 星期(0-6),星期天为星期的开始 |
%W | 一年中的星期数(00-53)星期一为星期的开始 |
%x | 本地相应的日期表示 |
%X | 本地相应的时间表示 |
%Z | 当前时区的名称 |
%% | %号本身 |
10.9 数据压缩
zlib 模块支持常见的数据存档和压缩格式, 支持:zlib, gzip, bz2, lzma, zipfile, tarfile.
import zlib
s = b'abcsssssssssssssssssssssssssssssssssssss'
print(len(s))
#压缩
t = zlib.compress(s)
print(len(t))
#解压
p = zlib.decompress(t)
print(p)
#crc32用于校验数据的正确性
c = zlib.crc32(s)
print(c)
运行结果:
40
14
b'abcsssssssssssssssssssssssssssssssssssss'
2314734969
10.10 性能测量
doctest 模块可以扫描模块并且测试在文档字符串中的测试.
Test.py:
import doctest
def average(data):
"""testmod
>>> print(average(1))
1
"""
return data/data
doctest.testmod()
运行结果:
**********************************************************************
File "/Users/chenxiaowei/Desktop/VsCode-PythonWorkSpace/Main.py", line 5, in __main__.average
Failed example:
print(average(1))
Expected:
1
Got:
1.0
**********************************************************************
1 items had failures:
1 of 1 in __main__.average
***Test Failed*** 1 failures.
unittest 模块可以在单独的文件里测试.
Test.py:
import unittest
def average(data):
return 10 / len(data)
class TestStatisticalFunctions(unittest.TestCase):
def test_average(self):
self.assertEqual(average([1, 2]), 5.0)
with self.assertRaises(ZeroDivisionError):
average([])
unittest.main()
运行结果:
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
assertEqual() 用于测试数据和结果. with assertRaises()用于比较测试是否会抛出异常.
10.12 自带电池
- xmlrpc.client 和 xmlrpc.server 模块使得实现远程过程调用变得小菜一碟。尽管存在于模块名称中,但不需要直接了解或处理XML。
- email 包是一个用于管理电子邮件的库,包括MIME和其他符合 RFC 2822 规范的邮件文档。与 smtplib 和 poplib 不同(它们实际上做的是发送和接收消息),电子邮件包提供完整的工具集,用于构建或解码复杂的消息结构(包括附件)以及实现互联网编码和标头协议。
- json 包为解析这种流行的数据交换格式提供了强大的支持。 csv 模块支持以逗号分隔值格式直接读取和写入文件,这种格式通常为数据库和电子表格所支持。 XML 处理由 xml.etree.ElementTree , xml.dom 和 xml.sax 包支持。这些模块和软件包共同大大简化了 Python 应用程序和其他工具之间的数据交换。
- sqlite3 模块是 SQLite 数据库库的包装器,提供了一个可以使用稍微非标准的 SQL 语法更新和访问的持久数据库。
- 国际化由许多模块支持,包括 gettext , locale ,以及 codecs 包。