11 模块
模块英文为Modules, 使用模块的好处:
- 方便其它程序和脚本的导入并使用。
- 避免函数名和变量名冲突。
- 提高代码的可维护性。
- 提高代码的可重用性。
新建一个.py文件,名称尽量不要与Python自带的标准模块名称相同。
Python中的包:
- 通过 import 的方式进行导入时 ,只能跟包和模块名,在访问时需要加相应的前缀,如“m2.”。 举例:import m2 ,print : ( m2.X )
- 使用 from......import可以导入包、模块、函数、变量
安装模块:
- windows + r 再执行 cmd
- 命令: pip install 模块名
- 再执行:python
- 测试:import 模块名
11.1 数学计算模块——math
在math模块中包含数学运算相关的函数等,例如指数、对数、平方根和三角函数等。
11.2 日期时间模块——datetime
- datetime:包含时间和日期。
- date:只包含日期。
- time:只包含时间。
- timedelta:计算时间跨度。
- tzinfo:时区信息。
- 去掉毫秒的方式 # now_time = datetime.datetime.today().replace(microsecond=0)
11.2.1 datetime类
datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None).
datetime类表示日期和时间等信息,
- datetime.today():返回当前的本地日期和时间。
- datetime.now(tz=None):返回指定时区的当前日期和时间,参数tz用于设置时区,如果参数tz为None或省略,则等同于today()。
- datetime.fromtimestamp(timestamp,tz=None):返回与UNIX时间戳对应的本地日期和时间。UNIX时间戳是从1970年1月1日00:00:00开始到现在为止的总秒数。我们在Python Shell中运行代码,看看运行结果怎样。
import datetime
d = datetime.datetime.today()
print(d) # 2023-01-31 12:10:14.268555
print(d.strftime('%Y-%m-%d %H:%M:%S')) # 2023-01-31 12:10:14
print(d.strftime('%Y-%m-%d')) # 2023-01-31
str_date = '2020-02-29 10:40:26'
date = datetime.datetime.strptime(str_date, '%Y-%m-%d %H:%M:%S')
print(date) # 2020-02-29 10:40:26
datetime1 = datetime.datetime(2020, 2, 29, 10, 40, 26)
print(datetime1) # 2020-02-29 10:40:26
11.2.2 date类
- date类表示日期信息,
date类的常用方法如下。
- date.today():返回当前的本地日期。
- date.fromtimestamp(timestamp):返回与UNIX时间戳对应的本地日期。# fromtimestamp 该函数的转化是根据本地的时区来的,一定要做的就是指定时区。
11.2.3 time类
time类表示一天中的时间信息,time.sleep(5) # 暂停多少秒
datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
11.2.4 计算时间跨度类——timedelta
datetime.timedelta(days=0, seconds=0, microseconds=0, minutes=0, hours=0, weeks=0)
- 其中的所有参数都可以为整数或浮点数,也可以为正数或负数,如右表所示。
- year 年、 month 月、day 天 、second 秒、micrsecond 微秒 、miliseconds 毫秒 、 minute 分钟、 hour 小时、 weeks 周
11.2.5 将日期时间与字符串相互转换
我们经常会遇到将日期时间与字符串相互转换的情况。
- 1 将日期时间对象转换为字符串时,称之为日期时间格式化。在Python中使用strftime()方法进行日期时间的格式化,在datetime、date和time三个类中都有一个实例方法strftime(format)。
- 2 将字符串转换为日期时间对象的过程,叫作日期时间解析。在Python中使用datetime.strptime(date_string,format)类方法进行日期时间解析。
- %m 两位月份、%y 两位年份、%Y四位年份、%d 两位天数、%H两小时表示(24h)、%I两位小时表示(12h)、%M两位分钟表示、%S两位秒表示、%f两位秒。
- 在strftime()和strptime()方法中都有一个格式化参数format,用来控制日期时间的格式,常用的日期和时间格式控制符如下表所示。
11.3 正则表达式模块——re
11.3.1 字符串匹配
- 字符串匹配指验证一个字符串是否符合指定的“字符串模板”,常用于用户输入验证。
- 例如,用户在注册时要输入邮箱,所以需要验证邮箱是否有效,这就要用到字符串匹配验证。我们使用match(p,text)函数进行字符串匹配,其中的参数p是正则表达式,即字符串模板,text是要验证的字符串。如果匹配成功,则返回一个Match对象(匹配对象),否则返回None。
11.3.2 字符串查找
字符串查找指从一个字符串中查找匹配正则表达式的子字符串,常用于数据分析、网络爬虫等数据处理中,常用的字符串查找函数如下:
- match函数:尝试从字符串的起始位置匹配一个模式,匹配成功则返回的是一个匹配对象(这个对象包含了我们匹配的信息),如果不是起始位置匹配成功的话,match()返回的是空。
- search(p,text):在text字符串中查找匹配的内容,如果找到,则返回第1个匹配的Match对象,否则返回None。p是正则表达式。
- findall(p,text):在text字符串中查找所有匹配的内容,如果找到,则返回所有匹配的字符串列表;如果一个都没有匹配,则返回None。p是正则表达式。
查找一个匹配项:
- 查找并返回一个匹配项的函数有3个:search、match、fullmatch,他们的区别分别是:
- search: 查找任意位置的匹配项
- match: 必须从字符串开头匹配
- fullmatch: 整个字符串与正则完全匹配
- 举例:result = re.match('^[a-z_][a-z\d_]{5,15}$', s) # s = 'sdfdslfopg'
查找多个匹配项:
- 查找多项函数主要有:findall函数 与 finditer函数:
- findall: 从字符串任意位置查找,返回一个列表.
- finditer:从字符串任意位置查找,返回一个迭代器.
11.3.3 字符串替换
正则表达式的字符串替换函数是subn(),该函数替换匹配的子字符串,返回值是替换之后的字符串,其语法格式如下:
- sub(parrern,repl,string,count = 0)
- 其中,参数pattern是正则表达式;参数repl是用于替换的新字符串;参数string是即将被替换的旧字符串;参数count是要替换的最大数量,默认值为零,表示不限制替换数量。
k = 'sfsadfgsdfsaf'
s, k = re.subn('d','s', k, count=0)
s # 'sfsasfgssfsaf'
k = 'sfsdfgsdfsaf'
s = re.sub('sd', '444', k, count=0)
s # 'sf444fg444fsaf'
11.3.4 字符串分割
在Python中使用re模块中的split()函数进行字符串分割,该函数按照匹配的子字符串进行字符串分割,返回字符串列表对象,其语法格式如下:
- re.split(pattrn,string,maxsplit=0)
第12章 文件读写(io操作)
- 验证是否存在文档的函数:student_txt = open(filename,'w',encoding='utf-8')
- 文档存储只能存储 'str' 文件
- 写入文本公式:tudent_txt.write(str(item)+'\n')
- endswith 以什么结尾,用于判断。 # if item endswith('.py'):
12.1 打开文件
我们在使用文件之前要先将文件打开,这通过open()函数实现。open()函数的语法如下: open(file,mode = 'r', encoding = None, errors = None)
open()函数中的参数还有很多,这里介绍4个常用参数:
先判断是否存在文件: # student_txt = open(filename,'w',encoding='utf-8')
1.file参数:
- file参数用于表示要打开的文件,可以是字符串或整数。如果file是字符串,则表示文件名,文件名既可以是当前目录的相对路径,也可以是绝对路径;如果file是整数,则表示一个已经打开的文件。
2.mode参数:
mode参数用于设置文件打开模式,用字符串表示,例如rb表示以只读模式打开二进制文件。用于设置文件打开模式的字符串中的每一个字符都表示不同的含义,对这些字符的具体说明如下。
- t:以文本文件模式打开文件。
- b:以二进制文件模式打开文件。
- r:以只读模式打开文件。.
- w:以只写模式打开文件,不能读内容。如果文件不存在,则创建文件;如果文件存在,则覆盖文件的内容。
- x:以独占创建模式打开文件,如果文件不存在,则创建并以写入模式打开;如果文件已存在,则引发FileExistsError异常。
- a:以追加模式打开文件,不能读内容。如果文件不存在,则创建文件;如果文件存在,则在文件末尾追加。
- +:以更新(读写)模式打开文件,必须与r、w或a组合使用,才能设置文件为读写模式。 # 不能单独使用
3.encoding参数
encoding用来指定打开文件时的文件编码,默认是UTF-8编码,主要用于打开文本文件。
4.errors参数
errors参数用来指定在文本文件发生编码错误时如何处理。推荐errors参数的取值为'ignore',表示在遇到编码错误时忽略该错误,程序会继续执行,不会退出。
12.2 关闭文件
在打开文件后,如果不再使用该文件,则应该将其关闭,会用到close()方法。 # file.close()
12.2.1 在finally代码块中关闭文件
对文件的操作往往会抛出异常,为了保证对文件的操作无论是正常结束还异常结束,都能够关闭文件,我们应该将对close()方法的调用放在异常处理的finally代码块中。
12.2.2 在with as代码块中关闭文件
with as提供了一个代码块,在as后面声明一个资源变量,在with as代码块结束之后自动释放资源。
12.3 读写文本文件
读写文本文件的相关方法如下。
- read(size=-1):从文件中读取字符串,size限制读取的字符数,size=-1指对读取的字符数没有限制。
- readline(size=-1):在读取到换行符或文件尾时返回单行字符串。如果已经到文件尾,则返回一个空字符串。size是限制读取的字符数,size=-1表示没有限制。
- readlines():读取文件数据到一个字符串列表中,每一行数据都是列表的一个元素。
- write(s):将字符串s写入文件中,并返回写入的字符数。
- writelines(lines):向文件中写入一个字符串列表。不添加行分隔符,因此通常为每一行末尾都提供行分隔符。
- flush( ):刷新写缓冲区,在文件没有关闭的情况下将数据写入文件中。
12.4 读写二进制文件
二进制文件的读写单位是字节,不需要考虑编码问题,二进制文件的主要读写方法如下:
- read(size=-1):从文件中读取字节,size限制读取的字节数,如果size=-1,则读取全部字节。
- readline(size=-1):从文件中读取并返回一行。size是限制读取的行数,如果size=-1,则没有限制。
- readlines():读取文件数据到一个字节列表中,每一行数据都是列表的一个元素。
- writelines(lines):向文件中写入一个字节列表。不添加行分隔符,因此通常为每一行末尾都提供行分隔符。
- flush():刷新写缓冲区,在文件没有关闭的情况下将数据写入文件中。
seek()方法语法如下:
- 用于移动文件的读取指针到指定位置
- fileObject.seek(offset[,whence])
- 参数: offset --偏移量,也就是代表需要移动偏移的字节数
- whence:可选,默认值为 0。表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
12.5 目录操作
12.6.1 os 模块
os模块是Python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样。
os模块与os.path模块用于对目录或文件进行操作。
打开内部文件: 举例:os.startfile('F:\\软件\\bilibili\\哔哩哔哩.exe' ) # 其中\\需要各增加一个,语句结尾追加‘\\ '.exe’, # 或者前面加上r'F:\软件\bilibili\哔哩哔哩.exe'
- getcwd() # 返回当前的工作目录
- listdir(path) # 返回指定路径下的文件和目录信息
- mkdir(path[, mode]) # 创建目录
- makedirs(path1/ path2...[, mode]) # 创建多级目录
- rmdir(path) # 删除目录
- removedirs(path1/ path2......) # 删除多级目录
- chdir(path) # 将path设置为当前工作目录
- 举例:os.chdir('G:\\01-project\\02-图解Python语法\\chap14') # 设置工作目录
12.6.2 os.path 模块
os.path模块:
- abspath(path) # 用于获取文件或目录的绝对路径
- exists(path) # 用于判断文件或目录是否存在, 如果存在返回True, 否则返回False.
- join(path, name) # 将目录与目录或者文件名拼接起来
- splitext() # 分离文件名和扩展名
- basename(path) # 从一个目录中提取文件名
- dirname(path) # 从一个路径中提取文件路径, 不包括文件名
- isdir(path) # 用于判断是否为路径
举例:print(os.path.abspath('01-测试.py')) # 获取文件或目录的绝对路径
walk 模块:
- 用于遍历当前目录及该目录下得所有子目录
关于unicode:(统一码 code:代码)
- 1. encode:编码 decode:解码
- 2. python内部编码方式为unicode,decode将其他编码方式转换成unicode编码方式,encode将unicode转换成其他编码方式。
- 3. 因此unicode相当于一个中转:
- (1)decode->unicode->encode
- (2)encode->unicode->decode
- Unicode 当然是一本很厚的字典,记录着世界上所有字符对应的一个数字。具体是怎样的对应关系,又或者说是如何进行划分的,就不是我们考虑的问题了,我们只用知道 Unicode 给所有的字符指定了一个数字用来表示该字符。
- UTF-8 是一个非常惊艳的编码方式,漂亮的实现了对 ASCII 码的向后兼容,以保证 Unicode 可以被大众接受。
- # ASCII 码是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,它是现今最通用的单字节编码系统
- UTF-8 是目前互联网上使用最广泛的一种 Unicode 编码方式,它的最大特点就是可变长。它可以使用 1 - 4 个字节表示一个字符,根据字符的不同变换长度。编码规则如下:
- 对于单个字节的字符,第一位设为 0,后面的 7 位对应这个字符的 Unicode 码点。因此,对于英文中的 0 - 127 号字符,与 ASCII 码完全相同。( ASCII中的0~31为控制字符;32~126为打印字符;127为Delete(删除)命令。)这意味着 ASCII 码那个年代的文档用 UTF-8 编码打开完全没有问题。
- 对于需要使用 N 个字节来表示的字符(N > 1),第一个字节的前 N 位都设为 1,第 N + 1 位设为0,剩余的 N - 1 个字节的前两位都设位 10,剩下的二进制位则使用这个字符的 Unicode 码点来填充。 # “汉”的 Unicode 码点是 0x6c49(110 1100 0100 1001) + 1110xxxx 10xxxxxx 10xxxxxx 一> UTF-8 编码为 11100110 10110001 10001001
10 Bug的常见类型
- 粗心导致的语法错误 SyntaxError:
- 1、漏了末尾的冒号,如if语句,循环语句,else子句等。
- 2、缩进错误,该缩进的没缩进,不该缩进的瞎缩进。 # tab 键 整体向右缩进,shift+tab 向左缩进
- 3、把英文符号写成中文符号,比如说:引号,冒号,括号。
- 4、字符串拼接的时候,把字符串和数字拼在一起。
- 5、没有定义变量,比如说while的循环条件的变量。
- 6、“==” 比较运算符和 ”=” 赋值运算符的混用。
- 知识不熟练导致的错误:
- 索引越界问题 IndexError 。 # Index 索引、指数
- append( )方法的使用掌握不熟练。 # append 一次只能添加一个变量,extend 可以添加多个变量
- 思路不清导致的问题解决方案
- 使用print()函数
- 使用 ”#”
- 被动掉坑:程序代码逻辑没有错,只是因为用户错误操作或者一些“例外情况”而导致的程序崩溃:
- Python提供了异常处理机制,可以在异常出现时即时捕获,然后内部“消化”,让程序继续运行
- try + except
- 多个except结构
- try...except...else结构
- try...except...else...finally 结构
- traceback模块 # 用于打印错误日志进行备案 traceback:回溯
- 使用traceback模块打印异常信息。