第五章 PYTHON标准库
sys是system的缩写,sys模块主要负责与Python解释器进行交互,模块提供了一系列用于控制python运行环境的函数和变量,用来获取操作系统和编译器的一些配置,环境设置以及操作。
sys.argv就是一个从程序外部获取参数的桥梁,argv属性值是一个列表。
argv的参数可以看作一个列表,用[] 下标的方式提取其中的元素。
常用方法
import sys
#如何查看sys里面有哪些方法
#help(sys)
#利用以上的不直观,我们可以dir
print(dir(sys))
属性或方法 | 描述 |
---|---|
sys.argv | 获取命令行参数列表,第一个参数是程序本身 |
sys.exit(n) | 退出 Python 程序,exit(0) 表示正常退出。当参数非 0 时,会引发一个 SystemExit 异常,可以在程序中捕获该异常 |
sys.version | 获取 Python 解释程器的版本信息 |
sys.maxsize | 最大的 Int 值,在 64 位操作系统上是 263-1 |
sys.path | 返回模块的搜索路径,初始化时使用 PYTHONPATH 环境变量的值 |
sys.platform | 返回操作系统平台名称 |
sys.stdin | 输入相关 |
sys.stdout | 输出相关 |
sys.stderr | 错误相关 |
len() | 获取长度 |
sys.path.insert(index,字符) | 指定下标插入数据 |
sys.path = [] | 删除所有路径 |
sys.getfilesystemencoding() | 获取文件系统使用编码方式,默认是 UTF-8 |
sys.modules | 以字典的形式返回所有当前 Python 环境中已经导入的模块 |
sys.builtin_module_names | 返回一个列表,包含所有已经编译到 Python 解释器里的模块的名字 |
sys.modules.keys() | 返回所有已将导入模块的key |
sys.flags | 命令行标识状态信息列表 |
sys.getrefcount(object) | 返回对象的引用数量 |
sys. getrecursionlimit() | 返回 Python 最大递归深度,默认为 1000 |
sys.getsizeof(object[, default]) | 返回对象的大小 |
sys.getswitchinterval() | 返回线程切换时间间隔,默认为0.005秒 |
sys.setswitchinterval(interval) | 设置线程切换的时间间隔,单位为秒 |
sys. getwindowsversion() | 返回当前 Windows 系统的版本信息 |
sys.hash_info | 返回 Python 默认的哈希方法的参数 |
sys.implementation | 当前正在运行的 Python 解释器的具体实现,如 CPython |
sys.thread_info | 当前线程信息 |
代码
#argv 获取命令行的参数
import sys
#argv第一个参数必须是文件的信息/程序信息
print(sys.argv)
print(sys.argv[3])
语法:
argv 获取命令行的参数
argv 的第一个参数/下标的是0的参数,一定会是我们运行文件的信息
注意:在cmd里面运行python,语法:python 文件名字 参数1 参数2
多个参数之间用空格隔开
语法:
sys.exit() 0是正常退出,1是不正常退出,无论是不是1都不会报错
for i in [1,2,3,4,5]:if i == 2:sys.exit(1)print(i) #1
#sys.version python版本号
print(sys.version) #3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)]
#maxsize int数值可以最大是263-1
print(sys.maxsize) #9223372036854775807
path列表是由一个目录名构成的列表,返回模块的搜索路径。Python从中查找扩展模块(python源模块,编译模块,二进制扩展),初始化时使用python环境变量的值。
#path 获取路径,返回一个list
print(sys.path)
#sys.path.insert(index,文件名字) 添加路径
sys.path.insert(0,"temp")
print(sys.path)
# sys.modules 获取我们导入的模块信息,返回一个字典
print(sys.modules)
sys.modules.keys() 只获取导入模块的名字
print(sys.modules.keys())
#导入模块不一定是内建模块,也有可能是我们自己封装的模块
# 获取内建模块的名字
a = sys.builtin_module_names
print(a)
练习题
定义一个函数,传入一个名字,查看是否是内建模块
def is_module(name):if name in a:print("是一个模块")else:print("什么都不是")is_module("time")
os模块
含义:os模块与操作系统交互,提供了访问操作系统底层的接口
sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境
os模块是python标准库中一个用于访问操作系统相关功能的模块,提供了一种可移值使用的操作系统的方法。使用os模块中提供的接口,可以实现跨平台访问,但是,并不是所有的os模块中的接口在全平台都通用的,有一些接口的实现需要特定的平台,如:linux相关文件权限和进程管理。
os模块的主要功能:系统相关、目录相关、目录及文件操作、执行命令和管理进程。
常用方法
方法或变量 | 用途 |
---|---|
os.mkdir('dirname') | 生成单级目录,相当于shell中mkdir dirname |
os.makedirs('dirname1/dirname2') | 可生成多层递归目录 |
os.rmdir('dirname') | 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname |
os.removedirs('dirname1') | 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 |
os.listdir('dirname') | 列出指定目录下的所有文件和子目录,包括隐藏文件并以列表方式打印 |
os.remove() | 删除一个文件 |
os.rename("oldname","newname") | 重命名文件/目录 |
os.path.abspath(path) | 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 |
os.path.dirname(path) | 返回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所指向的文件或者目录的最后修改时间 |
os.path.getsize(path) | 返回path的大小 |
os.getcwd() | 获取当前工作目录,即当前python脚本工作的目录路径 |
os.chdir("dirname") | 改变当前脚本工作目录;相当于shell下cd |
os.curdir | 返回当前目录: ('.') |
os.pardir | 获取当前目录的父目录字符串名:('..') |
os.stat('path/filename') | 获取文件/目录信息 |
代码
import os
#os.getcwd() 获取当前目录
#print(os.getcwd()) #D:\axc\Python\PythonTem
语法:
绝对路径/全路径:D:\axc\Python\PythonTemp\test.py
相对路径/半路经:Python\PythonTemp\test.py
想要写半路经,你的当前路径和D:\axc\Python\PythonTemp要一样
#os.mkdir() 创建一个单级文件夹
os.mkdir("D:\\axc\\Python\\PythonTemp\\temp")
#os.rmdir() 删除单级空文件夹
os.rmdir("D:\\axc\\Python\\PythonTemp\\temp")
#os.makedirs() 创建多层文件夹
os.makedirs("D:\\axc\\Python\\PythonTemp\\test\\2002bigdate")
#os.removedirs()删除多级空目录
os.removedirs("test\\2002bigdate")
#创建一个文件夹test
os.mkdir("test")
#在test里面创建一个文件temp.py(手动创建右键创建)
#修改文件名字temp为temp.txt
os.rename("D:\\axc\\Python\\PythonTemp\\test\\temp.py","test\\temp.txt")
#列出test文件夹里面所有的子文件以及子文件夹
print(os.listdir("test")) #['temp.txt'] listdir只列出文件/文件夹名字
#删除test这个文件夹
os.remove("test\\temp.txt")
os.rmdir("test")
#os.path.dirname() 获取路径的父目录(上一级目录)
a = os.path.dirname("D:\\axc\\Python\\PythonTemp\\test.py")
#print(a) #D:\axc\Python\PythonTemp
#os.path.join() 将多个路径进行拼接
b = os.path.join("D:","python","p.py")
#print(b) #D:python\p.py
#os.path.split() 拆分,将文件和文件夹进行拆分.返回一个元组
c = os.path.split("D:\\axc\\Python\\PythonTemp\\test.py")
print(c) #('D:\\axc\\Python\\PythonTemp', 'test.py')
#os.path.exists() 判断文件/文件夹是否存在
os.path.isabs() #判断是否是绝对路径
os.path.isdir() #判断是否是文件夹
os.path.isfile() #判断是否是文件
文件模式匹配:glob模块
glob模块根据给定模式生成满足该模式的文件名列表,该模式和正则表达式类似,但是相对更简单。星号(*)匹配0个或更多个字符,问号(?)匹配单个字符,使用方括号来指定字符范围
#glob.glob() 进行模式匹配,返回一个迭代对象
for i in glob.glob("D:\\axc\\Python\\PythonTemp\\*.py"):print(i)
#文件下面所有py为后缀的文件
for file in glob.glob("D:\\axc\\Python\\PythonTemp\\*.py"):print(file)print("-------------------------")
print(os.listdir('D:\\axc\\Python\\PythonTemp'))
注意:这里的glob返回指定的文件完整路径名,这点和os.listdir函数不同,os.listdir只是返回文件名。
优点
1.打印的是全路径
2.可以进行模式匹配
D:\axc\Python\PythonTemp\cat.py
D:\axc\Python\PythonTemp\ClearWindow.py
D:\axc\Python\PythonTemp\count.py
D:\axc\Python\PythonTemp\eval.py
D:\axc\Python\PythonTemp\sudo.py
D:\axc\Python\PythonTemp\test.py
D:\axc\Python\PythonTemp\其他文件.py
正则表达式:
正则的含义:普通字符和元字符构成的字符串,描述一类字符串规则
元字符
有特殊含义的字符
表达式 | 匹配 |
---|---|
.
|
小数点可以匹配除了换行符\n 以外的任意一个字符
|
|
|
逻辑或操作符 ,或 |
[]
|
匹配字符集中的一个字符 |
[^]
|
对字符集求反,也就是上面的反操作。尖号必须在方括号里的最前面 |
-
|
定义[] 里的一个字符区间,例如[a-z]
|
\
|
对紧跟其后的一个字符进行转义 |
()
|
对表达式进行分组,将圆括号内的内容当做一个整体,并获得匹配的值 |
import re
a = re.findall("a.c","abcdefg")
print(a) #['abc']
#匹配a或者c
a = re.findall("a|c","abdefgc")
print(a) #['a', 'c']
#匹配列表中的任意任意一个字符
a = re.findall("[acbe]","abdefgc")
print(a) #['a', 'b', 'e', 'c']
#除了a和c其余都要
a = re.findall("[^ac]","adfgcvs")
print(a) #['d', 'f', 'g', 'v', 's']
#a-c 意思是匹配abc三个字符
a = re.findall("[a-c]","adfgcvs")
print(a) #['a', 'c']
#意思是把adf作为一个整体进行输出
a = re.findall("(adf)","adfgcvs")
print(a) #['adf']
#去掉小数点的特殊含义,他就是一个小数点
a = re.findall("\.","adf.gcvs")
print(a) #['.']
转义字符:
一些无法书写或者具有特殊功能的字符,采用在前面加斜杠"\"进行转义的方法
表达式 | 匹配 |
---|---|
\r , \n
|
匹配回车和换行符 |
\t
|
匹配制表符 |
\\
|
匹配斜杠\
|
\^
|
匹配^ 符号
|
\$
|
匹配$ 符号
|
\.
|
匹配小数点.
|
预定义匹配字符集:
正则表达式中的一些表示方法,可以同时匹配某个预定定义字符集中的任意一个字符
表达式 | 匹配 |
---|---|
\d
|
任意一个数字,0~9中的任意一个 |
\w
|
任意一个字母或数字或下划线,也就是A~Z,a~z,0~9,_ 中的任意一个 |
\s
|
空格、制表符、换页符等空白字符的其中任意一个 |
\D
|
\d 的反集,也就是非数字的任意一个字符,等同于[^\d]
|
\W
|
\w 的反集,也就是[^\w]
|
\S
|
\s 的反集,也就是[^\s]
|
#匹配出0-9的数字
a = re.findall("\d","abc1e34r")
print(a) #['1', '3', '4']
# `\d`的反集,也就是非数字的任意一个字符,等同于`[^\d],除数字以外的
a = re.findall("\D","abc 123")
print(a) #['a', 'b', 'c', ' ']
# 任意一个字母或数字或下划线,也就是A~Z,a~z,0~9,_ 中的任意一个
a = re.findall("\w","abwc1e34r_")
print(a) #['a', 'b', 'w', 'c', '1', 'e', '3', '4', 'r', '_']
#`\w`的反集,也就是`[^\w]` ,除字母以外的
a = re.findall("\W","abwc1 e34r_")
print(a) #[' ']
#都可以匹配下划线了,那空格怎么匹配
a = re.findall("\s","abc 123")
print(a) #[' ']
# `\s`的反集,也就是`[^\s]`,除空格以外
a = re.findall("\S","abc 123")
print(a) #['a', 'b', 'c', '1', '2', '3']
重复匹配:
前面的表达式,无论是只能匹配一种自符的表达式,还是可以匹配多中字符其中的一个的表达式,都只能匹配一次
表达式 | 匹配 |
---|---|
{n}
|
表达式重复n次,比如\d{2} 相当于\d\d ,a{3} 相当于aaa
|
{m,n}
|
表达式至少重复m次,最多重复n次。比如ab{1,3} 可以匹配ab 或abb 或abbb
|
{m,}
|
表达式至少重复m次,比如\w\d{2,} 可以匹配a12 ,_1111 ,M123 等等
|
?
|
匹配表达式0次或者1次,相当于{0,1} ,比如a[cd]? 可以匹配a ,ac ,ad
|
+
|
表达式至少出现1次,相当于{1,} ,比如a+b 可以匹配ab ,aab ,aaab 等等
|
*
|
表达式出现0次到任意次,相当于{0,} ,比如\^*b 可以匹配b ,^^^b 等等
|
import re
#意思是ll要有两个
a = re.findall("l{2}","yesall")
print(a)
#意思是l要有2个到4个
a = re.findall("l{2,4}","alyesallnoalllowallll")
print(a) #['ll', 'lll', 'llll']
#意思是l最少要有两个,上不封顶
a = re.findall("l{2,}","alyesallnoallll")
print(a) #['ll', 'llll']
#意思是l至少有一个
a = re.findall("l+","yellowlow")
print(a) #['ll', 'l']
#意思是l至少有0个
a = re.findall("l*","yellowlow")
print(a) #['', '', 'll', '', '', 'l', '', '', '']
位置匹配:
有时,我们对匹配出现的位置有要求,例如:开头,结尾,单词之间
表达式 | 匹配 |
---|---|
^
|
在字符串开始的地方匹配,符号本身不匹配任何字符 |
$
|
在字符串结束的地方匹配,符号本身不匹配任何字符 |
\b
|
匹配一个单词边界,也就是单词和空格之间的位置,符号本身不匹配任何字符 |
\B
|
匹配非单词边界,即左右两边都是\w 范围或者左右两边都不是\w 范围时的字符缝隙
|
#1是否在开头
a = re.findall("^1","1364156")
print(a) #['1']
#6是否在末尾
a = re.findall("6$","1364156")
print(a) #['6']
贪婪模式与非贪婪模式
“贪婪模式”总是尝试匹配尽可能多的字符;“非贪婪模式”则相反,总是匹配尽可能少的字符
练习题
1.长度为8-10的用户密码(以字母开头、数字、下划线)
import re#输入一个密码,验证长度为8-10的用户密码(以字母开头、数字、下划线)
s = input("请输入一个密码:")
a= re.findall("^[a-zA-Z]\w{7,9}",s) #从0开始
print(a)
re模块
re模块的用途:
1.测试字符串内的模式---->输入字符串,查看字符串内是否出现电话号码,这称为数据验证
2.替换文本------>使用正则表达式来识别文档中的特定文本,完全删除该文本
3.基于模式匹配从字符串中提取子字符串--->查找文档中或输入域内特定的文本
含义:re模块是python独有的匹配字符串的模块,该模块中提供的很多功能是基于正则表达式实现的
常用方法
方法 | 描述 | 返回值 |
---|---|---|
compile(pattern) | 根据包含正则表达式的字符串创建模式对象 | re对象 |
search(pattern, string) | 在字符串中查找 。第一个匹配到的对象或者None | 返回一个match对象 |
match(pattern, string) | 在字符串的开始处匹配模式。 在字符串开头匹配到的对象或者None | 返回一个match对象 |
findall(pattern, string,flags) | 列出字符串中模式的所有匹配项 | 所有匹配到的字符串列表 |
finditer(pattern, string,flags) | 将所有匹配到的项生成一个迭代器 | 所有匹配到的字符串组合成的迭代器 |
match.group(index) | 将match对象拆分成字符串。不写index默认是0 | 返回match object中的字符串/元组 |
match.groups() | 将match对象转换成元组 | 返回由所有分组匹配到的字符串组成的tuple。 |
match.start(index) | 没有参数时,返回匹配到的字符串的起始位置。指定参数(整数)时,返回该分组匹配到的字符串的起始位置 | 返回int类型 |
match.end(index) | 没有参数时,返回匹配到的字符串的结束位置。指定参数(整数)时,返回该分组匹配到的字符串的结束位置。 | 返回int类型 |
match.span(index) | 返回一个二元tuple表示匹配到的字符串的范围,即(start, end) | 返回元组 |
split(pattern, string) | 根据模式的匹配项来分割字符串 | 分割后的字符串列表 |
sub(repl, string,count=0) | 将字符串中所有的pat的匹配项用repl替换 | 完成替换后的新字符串 |
subn(pat,repl, string) | 在替换字符串后,同时报告替换的次数 | 完成替换后的新字符串及替换次数 |
escape(string) | 将字符串中所有特殊正则表达式字符串转义 | 转义后的字符串 |
purge(pattern) | 清空正则表达式 | |
template(pattern) | 编译一个匹配模板 | 模式对象 |
fullmatch(pattern, string) | match方法的全字符串匹配版本 | 类似match的返回值 |
查询模块
#compile(pattern) 根据包含正则表达式的字符串创建模式对象 re对象
r = re.compile("[0-9]")
print(r)#返回一个编译正则的re对象
语法:
re.IGNORECASE:忽略大小写,同 re.I。
re.MULTILINE:多行模式,改变^和$的行为,同 re.M。
re.DOTALL:点任意匹配模式,让'.'可以匹配包括'\n'在内的任意字符,同 re.S。
re.LOCALE:使预定字符类\w \W \b \B \s \S 取决于当前区域设定,同 re.L。
re.ASCII:使 \w \W \b \B \s \S 只匹配 ASCII 字符,而不是Unicode 字符,同 re.A。
re.VERBOSE:详细模式。
import re
b = re.compile(r"[a-w]",re.I)
a = b.findall("ADbcG")
print(a) #['A', 'D', 'b', 'c', 'G']a = re.compile(r"""\d + # the integral part\. # the decimal point\d * # some fractional digits""", re.X)
b = re.compile(r"\d+\.\d*")
#search(pattern, string) 在字符串中查找 第一个匹配到的对象或者None
#扫描整个字符串,并返回它找到的第一个匹配(Match object)
r = re.compile("[0-9]")
a = r.search("123abc456")
print(a) #<re.Match object; span=(0, 1), match='1'>
#match(pattern, string) 在字符串开头匹配到的对象或者None 返回一个match对象
r = re.compile("[0-9]")
a = r.match("123abc456")
#a = r.match("123abc456") #开头不是数字,所以输出None
print(a) #<re.Match object; span=(0, 1), match='1'>
#findall(pattern, string,flags) 列出字符串中模式的所有匹配项 所有匹配到的字符串列表
r = re.compile("[0-9]")
a = r.findall("123abc4567")
print(a) #['1', '2', '3', '4', '5', '6', '7']
# finditer(pattern, string,flags) 将所有匹配到的项生成一个迭代器 返回一个迭代器
r = re.compile("[0-9]")
a = r.finditer("123abc456")
print(a) #<callable_iterator object at 0x0000020C599BFA88>
print(list(a))
语法:
[<re.Match object; span=(0, 1), match='1'>,
<re.Match object; span=(1, 2), match='2'>,
<re.Match object; span=(2, 3), match='3'>,
<re.Match object; span=(6, 7), match='4'>,
<re.Match object; span=(7, 8), match='5'>,
<re.Match object; span=(8, 9), match='6'>]
match object相关的常用方法:
match.group([group1,.....])
match.groups()
match.start.([group])
match.end([group])
match.spen([group])
#match.group(index)将match对象拆分成字符串。不写index默认是0返回match object中的字符串
语法:
分组编号从1开始,从左往右,每遇到一个左括号,分组编号+1。
组0总是存在的,它就是整个表达式。
没有参数时,group1默认为0,这时返回整个匹配到的字符串。
#空格不要忘了
r = re.compile(r"(\w+) (\w+)")
a = r.match("I LOvE you")
print(a) #<re.Match object; span=(0, 6), match='I LOvE'>
print(a.group()) #I LOvE 默认是0
print(a.group(1)) #I
print(a.group(2)) #LOvE
print(a.group(3)) #报错
指定多个参数的时候,就返回一个元组
print(a.group(1,2)) #('I', 'LOvE')r = re.compile(r"(\w+) (\w+)")
a = r.match("I LOvE you")
print(a.groups()) #('I', 'LOvE')
#match.start(index)没有参数时,返回匹配到的字符串的起始位置。指定参数(整数)时,返回该分组匹配到的字符串的起始位置
r = re.compile(r"(\w+) (\w+)")
a = r.match("I LOvE you")
print(a.start()) #0
print(a.start(2)) #2 第二个单词的起始位置是2,下标从0开始
#match.end(index)
r = re.compile(r"(\w+) (\w+)")
a = r.match("I LOvE you")
print(a.end()) #6
print(a.end(2)) #6
print(a.end(1)) #1
模块级的函数
re.match(pattern.string.flags=0) re.serch(pattern.string.flags=0)
1.分割字符串
splist()函数,在匹配的地方进行字符串分割,并返回一个list值
regex.split(string,maxsplist=0)
拆分
#split(pattern, string) 根据模式的匹配项来分割字符串 分割后的字符串列表
#意思是匹配到大写的字母就拆分
pattern = re.compile(r"[A-Z]+")
m = pattern.split("abcDefgHijkLmnoPqrs")
print(m) #['abc', 'efg', 'ijk', 'mno', 'qrs']
替换
语法:
sub(repl, string,count=0) 将字符串中所有的pat的匹配项用repl替换 |完成替换后的新字符串 |repl可以是一个字符串,也可以是一个函数。
count用于指定最多替换次数,不指定时全部替换。
r = re.compile(r"like", re.I) #s1 = r.sub(r"love", "I like you, do you like me?") #I love you, do you love me? #最多替换1次,所以把一个like替换了 s1 = r.sub(r"love", "I like you, do you like me?",count=1) print(s1) #I love you, do you like me?
#subn(repl, string) | 在替换字符串后,同时报告替换的次数 | 完成替换后的新字符串及替换次数 |
#同sub(),只不过返回值是一个二元tuple,即(sub函数返回值,替换次数)。
r = re.compile(r"like", re.I)
语法:
s1 = r.subn(r"love", "I like you, do you like me?")
print(s1) #('I love you, do you love me?', 2)
s1 = r.subn(r"love", "I like you, do you like me?",count=1)
print(s1) #('I love you, do you like me?', 1)
补充(R)
Python中字符串前面加上 r 表示原生字符串
与大多数编程语言相同,正则表达式里使用"\"作为转义字符
,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠
练习题
#匹配身份证
import re
s = input("请输入身份证:")
z= re.compile(r"^(\d{17})(\d|x)$",re.I)
#不能使用findall,他会返回两个字符串
a = re.search(z,s)
print(a.group())
import re#输入一个密码,验证长度为8-10的用户密码(以字母开头、数字、下划线)
s = input("请输入一个密码:")
z = re.compile("^[a-zA-Z]\w{7,9}")
a= re.findall(z,s) #从0开始
print(a)
datetime模块
含义:python中的datetime模块提供了操作日期和时间功能, 该模块提供了一下类对象
类名 | 描述 |
---|---|
datetime.date | 日期类 |
datetime.time | 时间类 |
datetime.datetime | 日期与时间类 |
datetime.timedelta | 表示两个date、time、datetime实例之间的时间差 |
datetime.tzinfo | 时区相关信息对象的抽象基类。 |
datetime.timezone | Python3.2中新增的功能,实现tzinfo抽象基类的类,表示与UTC的固定偏移量 |
两个属性
常量 | 功能说明 | 返回值 描述 |
---|---|---|
datetime.MAXYEAR | 返回能表示的最大年份 | 9999 |
** datetime.MINYEAR** | 返回能表示的最小年份 | 1 |
import datetime
print(datetime.MINYEAR) #1
print(datetime.MAXYEAR) #9999
datetime.date类
含义:class datetime.date(year, month, day)
datetime模块下的日期类(date),只能处理年月日这种日期时间,不能处理时分秒。
from datetime import date#创建一个日期对象
date01 = date(year=2021, month=12, day=22)
print(date01.year) #2021
print(date01.month) #12
print(date01.day) #22
常用的方法和属性
类方法**/属性名称** | 描述 |
---|---|
date.max | date对象所能表示的最大日期:9999-12-31 |
date.min | date对象所能表示的最小日期:00001-01-01 |
date.resoluation | date对象表示的日期的最小单位:天 |
date.today() | 返回一个表示当前本地日期的date对象 |
date.fromtimestamp(timestamp) | 根据给定的时间戳,返回一个date对象 |
d.year | 年 |
d.month | 月 |
d.day | 日 |
d.replace(year[, month[, day]]) | 生成并返回一个新的日期对象,原日期对象不变 |
d.timetuple() | 返回日期对应的time.struct_time对象 |
d.toordinal() | 返回日期是是自0001-01-01开始的第多少天 |
d.weekday() | 返回日期是星期几,[0, 6],0表示星期一 |
d.isoweekday() | 返回日期是星期几,[1, 7], 1表示星期一 |
d.isocalendar() | 返回一个元组,格式为:(year, weekday, isoweekday) |
d.isoformat() | 返回‘YYYY-MM-DD’格式的日期字符串 |
d.strftime(format) | 返回指定格式的日期字符串,与time模块的strftime(format, struct_time)功能相同 |
import time
from datetime import date
print(date.max) # 9999-12-31
print(date.min) # 0001-01-01
print(date.resolution) # 1 day, 0:00:00
print(date.today()) # 2020-03-17
print(date.fromtimestamp(time.time())) # 2020-03-17
d = date.today()
print(d.year) # 2020
print(d.month) # 3
print(d.day) # 17
print(d.replace(2019)) # 2019-03-17
print(d.replace(2019, 5)) # 2019-05-17
print(d.replace(2019, 5, 21)) # 2019-05-21
print(d.timetuple()) # time.struct_time(tm_year=2020, tm_mon=3, tm_mday=17, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=77, tm_isdst=-1)
print(d.toordinal()) # 737501
print(d.weekday()) # 1
print(d.isoweekday()) # 2
print(d.isocalendar()) # (2020, 12, 2)
print(d.isoformat()) # 2020-03-17
print(d.ctime()) # Tue Mar 17 00:00:00 2020
print(d.strftime('%Y/%m/%d')) # 2020/03/17
datetime.time类
### 定义:
class datetime.time(hour, [minute[, second, [microsecond[, tzinfo]]]])
datetime模块下的时间类,只能处理时分秒。
from datetime import time
a = time(11,59,59)
print(a) #11:59:59
常用方法
类方法**/属性名称** | 描述 |
---|---|
time.max | time类所能表示的最大时间:time(23, 59, 59, 999999) |
time.min | time类所能表示的最小时间:time(0, 0, 0, 0) |
time.resolution | 时间的最小单位,即两个不同时间的最小差值:1微秒 |
t.hour | 时 |
t.minute | 分 |
t.second | 秒 |
t.microsecond | 微秒 |
t.tzinfo | 返回传递给time构造方法的tzinfo对象,如果该参数未给出,则返回None |
t.replace(hour[, minute[, second[, microsecond[, tzinfo]]]]) | 生成并返回一个新的时间对象,原时间对象不变 |
t.isoformat() | 返回一个‘HH:MM:SS.%f’格式的时间字符串 |
t.strftime() | 返回指定格式的时间字符串,与time模块的strftime(format, struct_time)功能相同 |
from datetime import timeprint(time.max) # 23:59:59.999999
print(time.min) # 00:00:00
print(time.resolution) # 0:00:00.000001
t = time(12, 15, 40, 6666)
print(t.hour) # 12
print(t.minute) # 15
print(t.second) # 40
print(t.microsecond) # 6666
print(t.replace(21)) # 21:15:40.006666
print(t.isoformat()) # 12:15:40.006666
print(t.strftime('%H%M%S')) # 121540
print(t.strftime('%H%M%S.%f')) # 121540.006666
datetime.datetime类
### 定义:
class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
一定要注意这是datetime模块下的datetime类,千万不要搞混了!datetime模块下的日期时间类,你可以理解为datetime.time和datetime.date的组合类
from datetime import datetime
a = datetime(year=2021, month=12, day=3, hour=10, minute=59, second=59)
print(a) #2021-12-03 10:59:59
常用方法
类方法**/属性名称** | 描述 |
---|---|
datetime.today() | 返回一个表示当前本期日期时间的datetime对象 |
datetime.now([tz]) | 返回指定时区日期时间的datetime对象,如果不指定tz参数则结果同上 |
datetime.utcnow() | 返回当前utc日期时间的datetime对象 |
datetime.fromtimestamp(timestamp[, tz]) | 根据指定的时间戳创建一个datetime对象 |
datetime.utcfromtimestamp(timestamp) | 根据指定的时间戳创建一个datetime对象 |
datetime.combine(date, time) | 把指定的date和time对象整合成一个datetime对象 |
datetime.strptime(date_str, format) | 将时间字符串转换为datetime对象 |
dt.year, dt.month, dt.day | 年、月、日 |
dt.hour, dt.minute, dt.second | 时、分、秒 |
dt.microsecond, dt.tzinfo | 微秒、时区信息 |
dt.date() | 获取datetime对象对应的date对象 |
dt.time() | 获取datetime对象对应的time对象,tzinfo为None |
dt.timetz() | 获取datetime对象对应的time对象,tzinfo与datetime对象的tzinfo相同 |
dt.replace() | 生成并返回一个新的datetime对象,如果所有参数都没有指定,则返回一个与原datetime对象相同的对象 |
dt.timetuple() | 返回datetime对象对应的tuple(不包括tzinfo) |
dt.utctimetuple() | 返回datetime对象对应的utc时间的tuple(不包括tzinfo) |
dt.timestamp() | 返回datetime对象对应的时间戳,Python 3.3才新增的 |
dt.toordinal() | 同date对象 |
dt.weekday() | 同date对象 |
dt.isocalendar() | 同date对象 |
dt.isoformat([sep]) | 返回一个‘%Y-%m-%d’字符串 |
dt.ctime() | 等价于time模块的time.ctime(time.mktime(d.timetuple())) |
dt.strftime(format) | 返回指定格式的时间字符串 |
datetime.timedelta类
定义:
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, hours=0, weeks=0)
timedelta对象表示两个不同时间之间的差值。可以对datetime.date, datetime.time和datetime.datetime对象做算术运算
常用方法
类方法**/属性名称** | 描述 |
---|---|
timedelta.min | timedelta(-999999999) |
timedelta.max | timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999) |
timedelta.resolution | timedelta(microseconds=1) |
td.days | 天 [-999999999, 999999999] |
td.seconds | 秒[0, 86399] |
td.microseconds | 微秒[0, 999999] |
td.total_seconds() | 时间差中包含的总秒数,等价于: td / timedelta(seconds=1) |
import datetime
#一年有多少秒
print(datetime.timedelta(365).total_seconds()) #31536000.0
#获取现在时间
dt = datetime.datetime.now()
语法:
print(dt) #2021-10-04 17:22:31.928545
print(dt + datetime.timedelta(3)) # 3天后 2021-10-07 17:23:33.130410
print(dt + datetime.timedelta(-3)) # 3天前 2021-10-01 17:23:33.130410
print(dt + datetime.timedelta(hours=3)) # 3小时后 2021-10-04 20:24:30.536769
print(dt + datetime.timedelta(hours=-3)) # 3小时前 2021-10-04 14:24:30.536769
print(dt + datetime.timedelta(hours=3, seconds=30)) # 3小时30秒后 2021-10-04 20:25:55.309684
dt2 = dt + datetime.timedelta(hours=10)
print(dt2 - dt) # 10:00:00
td = dt2 - dt
print(td.seconds) # 36000
pprint模块
## 定义
pprint模块包含一个“美观打印器(PrettyPrinter)”,用于产生美观的数据结构视图。格式化程序生成可以由解释器正确解析的数据结构,并且容易使人阅读
## Printing
使用 pprint 模块的最简单方法是调用 pprint() 方法:
### 定义
pprint模块包含一个“美观打印器(PrettyPrinter)”,用于产生美观的数据结构视图。格式化程序生成可以由解释器正确解析的数据结构,并且容易使人阅读
语法:
`pprint.pprint`(*object*,*stream=None*,*indent=1*, *width=80*, *depth=None*)
indent --- 缩进,width --- 一行最大宽度,
depth --- 打印的深度,这个主要是针对一些可递归的对象,如果超出指定depth,其余的用"..."代替。
eg: a=[1,2,[3,4,],5] a的深度就是2; b=[1,2,[3,4,[5,6]],7,8] b的深度就是3
stream ---指输出流对象,如果stream=None,那么输出流对象默认是sys.stdout
from pprint import pprint
data = [("大数据一班",{"张三":18,"李四":20}),
("大数据二班",{"张三":18,"李四":20}),
("大数据三班",{"张三":18,"李四":20}),
("大数据四班",{"张三":18,"李四":20})]
#这种是打印一行
print(data)
pprint(data)
Formatting
定义
格式化数据结构
补充:日志的讲解
https://blog.csdn.net/colinlee19860724/article/details/90965100
import logging
from pprint import pformat
data = [("大数据一班",{"张三":18,"李四":20}),
("大数据二班",{"张三":18,"李四":20}),
("大数据三班",{"张三":18,"李四":20}),
("大数据四班",{"张三":18,"李四":20})]
#.basicConfig() 使用默认格式化程序创建 StreamHandler 并将其添加到根日志记录器中,从而完成日志系统的基本配置。如果没有为根日志程序定义处理程序,debug()、info()、warning()、error()和 critical() 函数将自动调用 basicConfig()。
logging.basicConfig(#级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG。level=logging.DEBUG,#为处理程序使用指定的格式字符串。#%(levelname) 日志级别 %(message)s已经记录的消息format='%(levelname)s %(message)s',
)
#打印
logging.debug('Logging pformatted data')
#对data进行格式化
formatted = pformat(data)
#Python splitlines() 按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。
for line in formatted.splitlines():#Python rstrip() 删除 string 字符串末尾的指定字符(默认为空格)#可写可不写logging.debug(line.rstrip())
pickle模块
定义
pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化。
序列化方法
方法 | 功能 |
---|---|
pickle.dump(obj, file) | 将Python数据转换并保存到pickle格式的文件内 |
pickle.dumps(obj) | 将Python数据转换为pickle格式的bytes字串 |
pickle.load(file) | 从pickle格式的文件中读取数据并转换为python的类型 |
pickle.loads(bytes_object) | 将pickle格式的bytes字串转换为python的类型 |
dumps()与loads()
语法:
dumps(数据类型) 将python转换成二进制
loads(二进制) 将二进制转换成python
import pickle as p String01 = "I love you"
a = p.dumps(String01)
print(a) #b'\x80\x03X\n\x00\x00\x00I love youq\x00.'b = p.loads(a)
print(b) #I love you
dump()与load()
语法:
dump(数据类型,文件对象) 把python转成二进制写入文件
load(文件对象) 把文件中的数据读取成二进制转成python
import pickle as plist01 = ["小明","翠花","王五","张三"]
#因为只能是二进制的,所以文件要声明成b 。要写进去所以是w
#open("f.txt","x") #创建一个文件
f1 = open("f.txt","wb")
p.dump(list01,f1) #文件是个二进制文件,打不开f1 = open("f.txt","rb")#r代表的是读
a = p.load(f1)
print(a) #['小明', '翠花', '王五', '张三']
文件的操作
创建/打开文件
Python内置了一个open()方法,用于对文件进行读写操作。使用open()方法操作文件,可分为三个步骤:1.打开文件、操作(读取/写入)文件、关闭文件
open()方法的返回值是一个file对象,基本语法如下:
语法:
变量名 = open(文件名,打开模式) f = open (filename,mode)
filename:1一个包含要访问的文件名称的字符串值,通常是一个文件路径
mode:打开文件的模式,默认是只读方式r
打开模式
文件的打开模式 | 描述 |
---|---|
'r' | 只读模式,默认值,如果文件不存在,返回FileNotFoundError |
'w' | 覆盖写模式,文件不存在则创建,存在则完全覆盖 |
'x' | 创建写模式,文件不存在则创建,存在则返回FileExistsError |
'a' | 追加写模式,文件不存在则创建,存在则在文件最后追加内容 |
'b' | 二进制文件模式 |
't' | 文本文件模式,默认值 |
'+' | 与r/w/x/a一同使用,在原功能基础上增加同时读写功能 |
#在路径下面创建text.py文件
#f = open("text.txt","x")#在桌面上创建test。windows下面\有转义的意思
#f = open("C:\\Users\\wangyujun\\Desktop\\text.txt","x")#想要打开的文件进行什么操作,就使用是什么模式
f = open("text.txt","r")
#想要打开的文件进行什么操作,就使用是什么模式
f = open("text.txt","r")
关闭文件
f.close()
#必须关闭文件,因为每次操作都是保存在内存中,并没有真正保存到文件中
读文件
常用方法
操作方法 | 描述 |
---|---|
<f>.write(s) | 向文件写入一个字符串或字节流 |
<f>.writelines(lines) | 将一个元素全为字符串的列表写入文件 |
<f>.seek(offset) | 改变当前文件操作指针的位置,offset含义如下: 0 – 文件开头; 1 – 当前位置; 2 – 文件结尾 |
#首先我们要打开一个文件,需要有一个文件的对象
f = open("test.txt","w")# <f>.write(s) 向文件写入一个字符串或字节流
s = "少年强则国强"
f.write(s)# <f>.writelines(lines) 将一个元素全为字符串的列表写入文件
l = ["馒头","大米","红烧肉"]
f.writelines(l)# <f>.seek(offset) 改变当前文件操作指针的位置,offset含义如下: 0 – 文件开头; 1 – 当前位置; 2 – 文件结尾
f.seek(2)
f.write("zuguo")
#读文件也可以这样操作,但是这里的文本必须是英文,编码格式必须是UTF-8
#首先我们要打开一个文件,需要有一个文件的对象
f = open("test.txt","r+")#这里的指针是指第一行的从几到几
#下标是从0开始的
f.seek(4)
r1 = f.readline()
print(r1)
删除文件
import os
os.remove("test.txt")
#大家先知道怎么使用,我们下一节课就讲解os模块
with语句
语法
with open(文件名) as 别名
f = open("f.txt","rb")
a = f.readline()
print(a)
#打开一个文件,每一次都需要关闭文件
f.close()
#和上面是一样的,只是不需要去关闭流
with open("f.txt","rb") as f:a = f.readline()print(a)
json模块
定义
Json是一种轻量级的数据交换格式。Json源自JavaScript语言,易于人类的阅读和编写,同时也易于机器解析和生成,是目前应用最广泛的数据交换格式。
Json是跨语言,跨平台的,只能对python的基本数据类型的操作,对python的类型就无能为力。
{}是一个对象 []数组
Python内置类型转换JSON类型对照表
Python | JSON |
---|---|
dict | object |
list,tuple | array |
str | string |
int,float,Enums | number |
True | true |
False | false |
None | null |
JSON类型转换Python类型对照表
JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
常用方法
方法 | 功能 |
---|---|
json.dump(obj,fp) | 将python数据类型转换并保存到json格式的文件内 |
json.dumps(obj) | 将python数据类型转换为json格式的字符串 |
json.load(fp) | 从json格式的文件中读取数据并转换为python的类型 |
json.loads(s) | 将json格式的字符串转换为python的类型 |
dumps()与loads()
语法:
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
sort_keys =True:是告诉编码器按照字典排序(a到z)输出。如果是字典类型的python对象,就把关键字按照字典排序。
indent:参数根据数据格式缩进显示,读起来更加清晰。一般写2和4
separators:是分隔符的意思,参数意思分别为不同dict项之间的分隔符和dict项内key和value之间的分隔符,
skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key
ensure_ascii=True:默认输出ASCLL码,如果把这个该成False,就可以输出中文。
check_circular:如果check_circular为false,则跳过对容器类型的循环引用检查,循环引用将导致溢出错误(或更糟的情况)。
allow_nan:如果allow_nan为假,则ValueError将序列化超出范围的浮点值(nan、inf、-inf),严格遵守JSON规范,而不是使用JavaScript等价值(nan、Infinity、-Infinity)。
default:default(obj)是一个函数,它应该返回一个可序列化的obj版本或引发类型错误。默认值只会引发类型错误。
dumps(python数据) 把python数据转换成json数据
loads(json) 把json数据转换成python数据
import jsonprint(json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])) # 输出结果:["foo", {"bar": ["baz", null, 1.0, 2]}]
print(json.dumps("\"foo\bar")) # 输出结果:"\"foo\bar" 里面相当于是一个整体
print(json.dumps('\u1234')) # 输出结果:"\u1234"
print(json.dumps('\\')) # 输出结果:"\\"#如果sort_keys是False,则随机打印结果,如果sortkeys为true,则按顺序打印
print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)) # 输出结果:{"a": 0, "b": 0, "c": 0}
这里indent是缩进的意思一般写为4 或者2
separators 是( ‘元素之间用逗号隔开’ , ‘key和内容之间’ 用冒号隔开)
这里是 ‘逗号’ , ‘冒号’ 中间的逗号不带引号
print(json.dumps([1, 2, 3, {'4': 5, '6': 7}], separators=(',', ':')))
# 输出结果:[1,2,3,{"4":5,"6":7}]
print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
这里indent是缩进的意思一般写为4 或者2
separators 是( ‘元素之间用逗号隔开’ , ‘key和内容之间’ 用冒号隔开)
这里是 ‘逗号’ , ‘冒号’ 中间的逗号不带引号
a = json.dumps([1, 2, 3, {'4': 5, '6': 7}], separators=(',', ':')) # 输出结果:[1,2,3,{"4":5,"6":7}]
print (json.loads(a))#\b就有特殊的意义,单词边界,本身没有什么意思
b = json.dumps("\"foo\bar")
print (json.loads(b)) #"foar
b = json.dumps("\"foo\bar")
print (json.loads(b)) #"foar
Python与数据库
数据库
windows安装数据库
windows10安装mysql_wyju的博客-CSDN博客
创建
updata------------>dml (数据操作语言)
insert------------>dml (数据操作语言)
delete------------>dml (数据操作语言)
select------------>dql (数据查询语言)
创建数据库
CREATE DATABASE 数据库名;
创建数据表
语法:
CREATE TABLE IF NOT EXISTS table_name (column_name column_type);
数据类型
类型 | 大小 | 用途 |
---|---|---|
INT或INTEGER | 4 Bytes | 整数 |
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
DATE | YYYY-MM-DD | 日期值 |
TIME | HH:MM:SS | 时间值或持续时间 |
YEAR | YYYY | 年份值 |
约束
主键自增(int)
primary key auto_increment
外键
CONSTRAINT <约束名>
FOREIGN KEY <外键名>(字段名1,字段名2...)
REFERENCES <主表名>(主键字段名)
唯一约束
<字段名> <数据类型> UNIQUE
非空约束
not null
默认约束
<字段名> <数据类型> DEFAULT <默认值>
切换数据库
#使用/切换这个数据库: use 数据库名字;
增(添加数据)
insert into 表名(列名1,列名2) values(值1,值2)
删
delete from 表名 where 表达式 #删除单个语句
drop database 库名字; #输出数据库
drop table 表名字;#输出数据表
改
更新数据
update 表名 set 列名=值 [where 表达式]
alter
alter table 旧表名 rename to 新表名; #修改表名字
alter table 表名字 modify 列名 (新)数据类型; #修改数据类型 id char(10)---->id int
alter table 表名字 change 旧列名字 新列名字 新数据类型;#修改列名字 studentname-->name
alter table 表名 drop 列名;#删除某一列
alter table 表名 add 新列名 (新列名)数据类型;#添加一个列
alter table 表名 modify 列名1 数据类型 after 列名字2;#把列1插入到列2后面
查
select 要查询的列名1,列名2 from 表名1,表2
where 表达式1 and/not/or 表达式2
order by 列名字 desc/asc #order by 排序 desc降序 asc升序
limit 数字 #限制查询的条数 limit(2, 5)第2条数据到第5条数据
练习题
创建学生信息表。字段有:学生id(主键自增),学生姓名,性别,生日,电话(不为空),身份证号(唯一)
创建科目表:字段有:科目id(主键自增),科目名字
成绩表:成绩id(主键自增,成绩,科目id(外键),学生id(外键))
分别插入十条数据
#学生信息表
create TABLE studentInfo(
studentId int auto_increment primary key,
StudentName varchar(20),
#性别
Gender varchar(2),
Birthday date,
Age int(4),
BeginYear year,
Phone varchar(11) not null,
idcard varchar(20) not null unique
);#科目表
create TABLE subject(
subjectId int auto_increment primary key,
subjectname varchar(20)
);#成绩表
create TABLE exam(
examId int auto_increment primary key,
exam float(4),
subjectid int,
constraint fk_subjectr_id foreign key(subjectid) references subject(subjectId),
studentid int,
constraint fk_student_id foreign key(studentid) references studentInfo(studentId)
);
python与数据库
1.安装pymsql
PyMySQL是一个纯python实现的mysql客户端操作库,支持事务,存储过程\批量执行
步骤:
pip install pymysql
列出软件包清单
pip list
查看软件包信息
pip show django
2.连接mysql
连接方法
使用python连接mysql数据库
1.6个常用的连接参数
pymysql.connect(host,user, password,port,db,charset)
host:MySQL服务器所在的主机的ip;
user:用户名
password:密码
port:连接的MySQL主机的端口,默认是3306
db:连接的数据库名
charset:当读取数据出现中文会乱码的时候,需要我们设置一下编码;python3默认采用的utf8字符集
注意:首先打开服务----->启动mysql
2.python连接MySOL的语法:
import pymysql
import pymysqldb=pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='temp',charset='utf8')
#运行不报错就是可以了
3.cursor游标对象
定义
它负责执行我们熟悉的SQL语句
开启游标
# 开启mysql的游标功能,创建一个游标对象
cursor = db.cursor()
常用方法
方法 | 功能 |
---|---|
execute(query, args) | 执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数; |
executemany(query, args) | 执行单条sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数 |
注意:区别是:批量添加的时候executemany比较快
# 要执行的SQL语句,确保数据表中有相应的数据
sql = "select * from exam;"
# 使用游标对象执行SQL语句;
cursor.execute(sql)
cursor用来查询数据的方法
我们执行完sql语句怎么查询返回的受影响的函数呢,有以下及格方法
方法 | 功能 |
---|---|
fetchone() | 返回一条结果行 |
fetchmany(size) | 接收size条返回结果行。如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据 |
fetchall() | 接收全部的返回结果行 |
import pymysqldb=pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='temp',charset='utf8')
#运行不报错就是可以了# 开启mysql的游标功能,创建一个游标对象;
cursor = db.cursor()# 要执行的SQL语句,确保数据表中有相应的数据
sql = "select * from exam;"
# 使用游标对象执行SQL语句;
cursor.execute(sql)
# 使用fetchone()方法,获取返回的结果,但是需要用变量保存返回结果;
#data = cursor.fetchone() #(1, '张三', 60) 单条数据
#多条数据
#data = cursor.fetchall() #((1, '张三', 60), (2, '李四', 60), (3, '王五', 80))
#两条数据
data = cursor.fetchmany(2) #((1, '张三', 60), (2, '李四', 60))
print(data)
# 断开数据库的连接,释放资源;
db.close()
游标类型(了解)
类型 | 意义 |
---|---|
Cursor | 默认,元组类型 |
DictCursor | 字典类型 |
DictCursorMixin | 支持自定义的游标类型,需先自定义才可使用 |
SSCursor | 无缓冲元组类型 |
SSDictCursor | 无缓冲字典类型 |
# 开启mysql的游标功能,创建一个游标对象;
cursor = db.cursor(cursor=DictCursor)
操作数据库
创建表
import pymysqldb=pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='temp',charset='utf8')
#运行不报错就是可以了# 开启mysql的游标功能,创建一个游标对象;
cursor = db.cursor()#创建表,字段是id,姓名,年龄,性别
sql = """
CREATE TABLE ceshi(id int,name varchar(10),age int,sex char(10)
) """
# 使用游标对象执行SQL语句;
cursor.execute(sql)
# 断开数据库的连接,释放资源;
db.close()
插入数据
插入单调
import pymysqldb=pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='temp',charset='utf8')
#运行不报错就是可以了# 开启mysql的游标功能,创建一个游标对象;
cursor = db.cursor()#插入数据
sql = """
insert into ceshi(id, name, age, sex)
values(%s,%s,%s,%s)
"""
try:# 使用游标对象执行SQL语句;cursor.execute(sql,(2,"翠花",19,"男"))db.commit()
except Exception as ex:print('插入语句错误' + str(ex))db.rollback()
finally:db.close()
插入多条数据
import pymysqldb=pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='temp',charset='utf8')
#运行不报错就是可以了# 开启mysql的游标功能,创建一个游标对象;
cursor = db.cursor()#插入数据
sql = """
insert into ceshi(id, name, age, sex)
values(%s,%s,%s,%s)
"""
data = [(3,"王五",19,"男"),(4,"李四",19,"男"),(5,"赵六",19,"男")
]try:# 使用游标对象执行SQL语句;cursor.executemany(sql,data)db.commit()
except Exception as ex:print('插入语句错误' + str(ex))db.rollback()
finally:db.close()
查询数据
import pymysqldb=pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='temp',charset='utf8')# 开启mysql的游标功能,创建一个游标对象;
cursor = db.cursor()
# 要执行的SQL语句,确保数据表中有相应的数据
sql = "select * from ceshi;"
# 使用游标对象执行SQL语句;
cursor.execute(sql)
#多条数据
data = cursor.fetchall()
print(data)
# 断开数据库的连接,释放资源;
db.close()
更新数据
import pymysqldb=pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='temp',charset='utf8')# 开启mysql的游标功能,创建一个游标对象;
cursor = db.cursor()
# 要执行的SQL语句,确保数据表中有相应的数据
sql = "update ceshi set age=%s, sex=%s where id=%s;"
try:# 使用游标对象执行SQL语句;cursor.execute(sql,(50,"女",3)) db.commit()
except Exception as ex:print('插入语句错误' + str(ex))db.rollback()
finally:db.close()
删除数据
import pymysqldb=pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='temp',charset='utf8')# 开启mysql的游标功能,创建一个游标对象;
cursor = db.cursor()
# 要执行的SQL语句,确保数据表中有相应的数据
sql = 'delete from ceshi where id=%s'
try:cursor.execute(sql, 3) db.commit()
except Exception as ex:print('插入语句错误' + str(ex))db.rollback()
finally:db.close()
总结:执行事务
事务机制可以确保数据一致性。
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
· 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的各种操作要么都做,要么都不做。
· 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
· 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
· 持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
在pymysql模块是默认开启MySQL的事务功能的,MySQL不会自动提交所执行的相关SQL语句。因此,进行"增"、"删"、"改"的时候,一定要使用db.commit()提交事务,否则就看不见所插入的数据。
同时,进行"增"、"删"、"改"的时候,一定要使用try…except…语句,因为SQL语句一旦没有执行成功,我们可以使用db.rollback()回滚到操作之前的状态;当语句执行成功,我们就db.commit()提交事务。
math模块
定义:
math模块是基础的python中的数学函数模块,进行一些数学计算功能
math中的函数不可以用于太过于复杂的数的运算
基本函数
函数 | 用法 | 例子 |
---|---|---|
ceil(x) | 向上取整操作,返回类型:int | ceil(3.2) 输出:4 |
floor(x) | 向下取整操作,返回类型:int | floor(3.2) 输出:3 |
pow(x,y) | 计算一个数x的y次方;返回类型:float,该操作相当于**运算但是结果为浮点 | pow(2,3) 输出:8.0 |
sqrt(x) | 开平方,返回类型:float | sqrt(4) 输出:2.0 |
fabs(x) | 对一个数值获取其绝对值操作 | fabs(-1) 输出:1 |
copysign(x,y) | 返回一个符号为y值为x的数值,返回类型:float | copysign(2, -4)输出:-2.0; copysign(2, 4)输出:2.0 |
factorial(x) | 返回一个整形数值的阶乘 | factorial(3)输出:6 |
fmod(x,y) | 取模运算,返回类型:float | fmod(4,2)输出:0.0 fmod(4,5)输出:4.0 fmod(4,3)输出:1.0 |
fsum([]) | 返回迭代器中值的精确浮点和,返回类型:float | fsum([1.1,2.23]) 输出:3.33 fsum([2.4,4.3]) 输出:6.699999999999999 |
gcd(a, b) | 返回a、b的最大公约数,返回类型:int | gcd(2,4) 输出:2 |
isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0) | 判断两个数是否接近,返回类型:True/False | isclose(0.99,1,rel_tol=0.2) 输出:True isclose(0.9999999999,0.999999999991) 输出:True math.isclose(0.99,0) 输出:False |
modf(x) | 返回x的小数部分和整数部分。两个结果都带有x的符号,并且都是浮点数 | modf(2.4) 输出:(0.3999999999999999, 2.0) |
trunc | 取整,返回类型:int | trunc(44.3333)输出:44 |
import math
a = math.ceil(3.2) #向上取整
a = math.floor(3.2) #向下取整
a = math.pow(3,2) #3的2次方
a = math.sqrt(4) #开平方
a = math.fabs(-1) #绝对值
a = math.copysign(4, -2) #符号是符号,值是数值
a = math.factorial(4) #阶乘 4*3*2*1
a = math.fmod(4,2) #取余
a = math.fsum([2,3]) #迭代器的和
print(a)
定义常数
常数名称 | 使用说明 |
---|---|
pi | π = 3.141592 ...**,可用精度** |
e | e = 2.718281 ...,达到可用的精度 |
tau | τ = 6.283185 ......,可达到精度 |
inf | 无穷大 |
nan | 非数字 |
对数和三角函数
函数 | 用法 | 例子 |
---|---|---|
log(n) | e**为底数** | log(5) 输出结果: 1.6094379124341003 |
log(n, basic) | 其他数为底数 | log(2, 5)输出结果: 0.43067655807339306 |
log2(n) | 2为底数 | log2(5)输出结果: 2.321928094887362 |
log10(n) | 10为底数 | log10(2) 输出结果 0.3010299956639812 |
sin(x) | 正弦函数 | sin(5) 输出结果: -0.9589242746631385 |
cos(x) | 余弦函数 | cos(5) 输出结果: 0.28366218546322625 |
tan(x) | 正切函数 | tan(5) 输出结果: -3.380515006246586 |
在数学里面,log用于表示一般的对数,可以用任意一个数作为底数。. 【举例,2的2次方等于4,那么,log2 (4)就等于2。. 】. 而lg在数学里面称为常用对数,常用对数就是以10为底数的对数。. 【举例,10的2次方等于100,那么lg (100)就等于2。. 】.
import matha = math.log(5)
a = math.log(2,5)
a = math.log2(5)
a = math.log10(2)
a = math.sin(5)
print(a)
random模块(随机数)
random模块用于生成伪随机数,
常用方法
方法 | 使用说明 |
---|---|
random.random() | 随机生成一个0-1之间的浮点数 |
random.randint(start,stop) | 随机生成一个start,stop之间的整数 |
random.randrange(start,stop,step) | 随机生成一个start,stop之间的整数 |
random.choice(sequence) | 从一个序列中随机选择一个元素 |
random.shuffle(sequence) | 随机打乱列表的顺序,原列表发生变化 |
random.sample(population,k) | 从集合中随机抽取K个不重复的元素形成新的序列,返回的是一个新的序列,不会破坏原有序列。 |
针对浮点数
import random as ra
#random.random() 随机生成一个浮点数
print(ra.random()) #0.7025318415790162
针对整数
注意:在使用后面的方法时,一定要小心区间的开闭
import random as ra
"""
random.randint(start,stop) 随机生成一个start,stop之间的整数
随机产生start-stop之间的整数,包括start和stop。
"""
for i in range(10):a = ra.randint(0,10)print(a)
语法:
random.randrange(start,stop,step) 随机生成一个start,stop之间的整数
1.random.randrange(stop) 不写start,默认是0
2.左开右闭
3.step 步长,间隔
#a = ra.randrange(10) #0-9之间的数据,不包含10
#a = ra.randrange(1,10) #1-10,不包含10
a = ra.randrange(1,10,2) #步长2,相当于奇数
print(a)
针对序列类型
语法:
random.choice(sequence) 从一个序列中随机选择一个元素
1.只能从字符串、元组、列表中随机获取
random.shuffle(sequence) 随机打乱列表的顺序,原列表发生变化
random.sample(population,k) 从序列中随机抽取k个元素,返回一个新元素
import random as ra
String01 = "I love you"
list01 = ["张三","李四","王五","赵六"]
tuple01 = (1,2,3)
# 报错 dict01 = {"张三":14,"王五":20,"李四":40}
# 报错 set01 = {1,2,3,4}
a = ra.choice(String01)
print(a)
import random as ra#自能是列表类型
String01 = "I love you" #报错 字符串是字母有序的组合
list01 = ["张三","李四","王五","赵六"]
tuple01 = (1,2,3) #报错
dict01 = {"张三":14,"王五":20,"李四":40} #报错
set01 = {1,2,3,4} #报错
ra.shuffle(list01)
print(list01)
import random as ra
#字典不可以
String01 = "I love you"
list01 = ["张三","李四","王五","赵六"]
tuple01 = (1,2,3)
dict01 = {"张三":14,"王五":20,"李四":40} #报错
set01 = {1,2,3,4}
a= ra.sample(set01,3)
print(a)
练习题
1.随机生成3个0-9之间的整数,若其中有两个值相等,则提示中奖,否则提示谢谢参与
import random
a1 = int(random.random()*10)
a2 = int(random.random()*10)
a3 = int(random.random()*10)
print(a1,a2,a3)
if a1==a2 or a2==a3 or a1==a3:print("中奖")
else:print("谢谢参与")
2.红包随机。
import random
#分配红包函数---fphb
#红包的总个数--zNumber
#红包的钱数,以分为单位---money
def fphb(zNumber, money):result = []number = zNumber#依据红包总个数遍历,有四个红包,就遍历四次for i in range(zNumber):#红包总个数不断的在减一number -= 1#红包个数大于0证明还有人没领红包if number > 0:#随机分钱,范围在1-m = random.randint(1, money)else:#最后一个人拿到剩下的钱m = money#把分出去的钱减去money -= m#结果从分换算成了元result.append(m / 100.0)return resultn = int(input('红包个数:'))
#为什么money要乘100,我们的单位是分
m = eval(input('总金额:') * 100)
list01= fphb(n, m)
print(list01)
第五章 PYTHON标准库相关推荐
- 第 9 章 Python 标准库概览
整理的文章内容主要来源为高教版<计算机等级考试二级 Python>教程视频讲义,并且更正了原讲义中的错误的地方. 专栏文章索引如下: 考试大纲 第 1 章 程序设计基本方法 第 2 章 P ...
- python语言程序设计 梁勇_计算机二级教程 Python语言程序设计,第9章Python标准库概览...
第九章学习知识导图 考点主要是: 1) 标准库: turtle库(必选) 2) 标准库: random库(必选).time库(可选) 3) 作者归纳:这章考大题和选择题的读程序题,本章结束,pytho ...
- A Byte of Python 笔记(12)python 标准库:sys、os,更多内容
第14章 python 标准库 Python标准库是随Python附带安装的,它包含大量极其有用的模块. sys 模块 sys 模块包含系统对应的功能.如 sys.argv 列表包含命令行参数. # ...
- 第 11 章 Python 第三方库纵览
整理的文章内容主要来源为高教版<计算机等级考试二级 Python>教程视频讲义,并且更正了原讲义中的错误的地方. 专栏文章索引如下: 考试大纲 第 1 章 程序设计基本方法 第 2 章 P ...
- 第十五章 Python和Web
第十五章 Python和Web 本章讨论Python Web编程的一些方面. 三个重要的主题:屏幕抓取.CGI和mod_python. 屏幕抓取 屏幕抓取是通过程序下载网页并从中提取信息的过程. 下载 ...
- python标准库不需要导入即可使用其中的所有对象和方法_Python程序设计-中国大学mooc-题库零氪...
<Python程序设计基础>课程导学 单元测验 1.下面属于Python应用领域的有? A.数据分析 B.云计算 C.开发操作系统 D.网络安全 E.树莓派 F.数据可视化 2.在Wind ...
- python标准库不需要导入即可使用其中的所有对象和方法_Python编程及应用-中国大学mooc-题库零氪...
<Python程序设计基础>课程导学 单元测验 1.下面属于Python应用领域的有? A.数据分析 B.云计算 C.开发操作系统 D.网络安全 E.树莓派 F.数据可视化 2.在Wind ...
- 汤老师的Python标准库
Python常用标准库 汤小洋 关注 0人评论 701人阅读 2018-08-26 18:05:12 (转自汤老师的博客http://blog.51cto.com/12402007/2164567) ...
- Python 标准库之 xml.etree.ElementTree xml解析
Python 标准库之 xml.etree.ElementTree Python中有多种xml处理API,常用的有xml.dom.*模块.xml.sax.*模块.xml.parser.expat模块和 ...
- Python标准库04 文件管理 (部分os包,shutil包)
摘要:Python标准库 os包: rmdir, mkdir, listdir, remove, rename, chmod, chown, stat, symlink shutil包: copy, ...
最新文章
- Bootstrap表单验证插件bootstrapValidator使用方法整理
- MM32F3277 MicroPython移植过程中对应的接口文件
- 感知算法论文(七):DFANet: Deep Feature Aggregation for Real-Time Semantic Segmentation(2019)
- 有的日期输入框,可直接调用javascripts
- python until怎么用_python基础之从认识python到python的使用
- 华为P30系列高清渲染图曝光:后置三摄拍照要上天
- js递归遍历json树_2020-08-26:裸写算法:树的非递归先序遍历
- 一文搞定移动端适配!
- 根据一览,自动生成Sheet页
- python全景图像拼接_超详讲解图像拼接/全景图原理和应用 | 附源码
- objenesis的基本使用方法
- 通达信 python_python 适用通达信
- 银行业务头条体系推广
- android自定义区域生成截图,一文看懂MIUI区域截屏 使用教程 (钉子户米6也能用)...
- meanshift跟踪算法
- python画名侦探柯南_基于flask的可视化动漫分析网站【python入门必学】
- Rancher Cluster is being upgraded
- 什么叫做云计算?学习云计算先要理解
- vue+element自动计算天数
- 跳棋最少移动次数 java,跳棋
热门文章
- matlab 读取mp3文件,MATLAB音频文件读取
- ios visio流程图_微软visio绘图查看器ios版下载|Microsoft Visio Viewer iphone/ipad版下载 v1.17 - 跑跑车苹果网...
- 基于NFC的Android读写软件,NFC读写(android代码)
- python安装包下载及安装(超详细)
- 数学建模c语言知识,数学建模方法总结
- MATLAB通信系统建模与仿真
- Java自学视频整理
- 安全测试|SQL注入技术
- 世界顶级图表-华尔街日报配色方案详解
- Vensim学习之Random Normal函数的使用