导图社区 python知识总结
下图介绍了第二阶段的python学习的知识点,内容有正则表达式、函数、面向对象程序设计、模块、异常处理及程序调试、文件及目录操作、操作设计库等,收藏下图学习吧!
编辑于2021-06-30 11:34:33PY第二阶段总结
第八章、正则表达式
正则表达式又称规则表达式,简称RE或者regex:它不是某种编程语言特有,它是一种计算机的概念,通常被用来检索和替换符合某些规则的文本。
正则表达式的语法
行定位符
行定位符 ^行文本开头检索 $行文本结尾检索 如 ^tm tm equal Tomorrow Moon 可以匹配,Tomorrow Moon equal tm 就无法匹配 而 $tm tm equal Tomorrow Moon 不可以匹配,Tomorrow Moon equal tm 可以匹配 tm 就可以匹配任意含有tm的文本
元字符
代码 说明 . 匹配除换行符以外的任意字符(代码为小数点) \w 匹配字母或数字或下划线或汉字 \s 匹配任意空白符 \d 匹配数字 \b 匹配单词的开始或结束 ^ 匹配字符串的开始 $ 匹配字符串的结束 - 表示范围 [] 匹配括号中的任意一个字符 *、+、? 量词
例子: \brm\w*\b \b开始和结束,先匹配rm字符内容,然后在匹配任意数量的字母或者数字,结果可以为:rmapplication或者rm7282或者rmadd4841 如果匹配特定数量的数字 ^\d{9}$ 9位数 这里引出【限定符】的概念:指定数量的字符
重复
限定符 说明 举例 ? 匹配前面字符零次或一次 color?u,可以匹配color或者coloru + 匹配前面字符一次或多次 go+gle,可以匹配google或者go……gle * 匹配前面字符零次或多次 go*gle,可以匹配ggle或者go……gle {n} 匹配前面字符n次 go{3}gle,可以匹配gooogle {n,} 匹配前面字符至少n次 go{3,}gle,可以匹配gooogle或gooo……gle {n,m} 匹配前面字符n到m次 go{3,5}gle,可以匹配gooogle、goooogle、gooooogle
字符类
在匹配没有预定义的字符时,可以使用[]中括号,比如[aeiou]匹配的就是任一英文元音字母,[?./。]匹配的就是任一标点符号, [0-9]等同\d [a-z0-9A-Z]等同\w 如果想要匹配非英文字母可以参考链接中的参数
https://blog.csdn.net/u012767761/article/details/107932892?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162243843316780262597046%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162243843316780262597046&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~times_rank-1-107932892.first_rank_v2_pc_rank_v29&utm_term=u4e00-%5Cu9fa5&spm=1018.2226.3001.4187
排除字符
正则表达式提供了^字符,[^a-zA-Z]表示匹配所有非26英文字母大小写的内容
选择字符
正则表达式提供了 | 字符,(^\d{15}$)|(^\d{18}$)|(^\d{17})(\wX)$表示可以匹配15位数字,或者18位数,或者17位数但第18位是X
转义字符
正则表达式提供了 \ 字符
分组
可以使用小括号来进行分组 ( )
使用正则表达式
在Python中使用正则表达式,是将其作为模式字符串使用的。 例如,将匹配不是字母的一个字符的正则表达式表示为模式字符串,可以使用以下代码:'[^a-zA-Z]' 而,如果将匹配以字母m开头的单词的正则表达式表示为模式字符串,则不能在其两侧直接添加引号定界符,需要使用\将\给转义了:'\\bm\\w*\\b' 由于模式字符串中可能包括大量的特殊字符和反斜杠,所以需要写为原生字符串,即在模式字符串前加r或R,所以上面的字符串采用原生字符串则为:r'\bm\w*\b'
使用re模块来进行操作
匹配
re.match(模式字符串,要匹配的字符串,可选参数用于表示标志位)
要注意,该方法从字符串最开始位置进行匹配,如果第一个字符就不匹配,将直接结束匹配过程,返回None
re.search(模式字符串,要匹配的字符串,可选参数用于表示标志位)
区别于match方法,search方法会检索目标全部位置
re.findall(模式字符串,要匹配的字符串,可选参数用于表示标志位)
区别于上面两种方法,findall返回值是列表类型,上两种是match对象
如果在指定的模式字符串中包含分组,则返回与分组匹配的文本列表。 如果想获取整个模式字符串的匹配,可以将整个模式字符串使用一堆小括号进行分组。 然后在获取结果时,只取返回值列表的每个元素的第一个元素。
替换
sub(pattern,repl,string,counts,[flags]) pattern模式字符串 repl替换的字符 counts替换的次数,默认0即全部替换
分割
split(pattern,string,[maxsplit],[flags]) maxsplit最大分割次数
import re mszfc = r'mr_\w+' # 目标是mo字符 neirong = "Mr_shp mr_shop mm_shop" match = re.match(mszfc, neirong, re.I) print(match) # 这里运行返回的结果是:<re.Match object; span=(0, 6), match='Mr_shp'>,第二个部分应该是索引,第三个部分则是展示内容 neirong2 = "bMr_shp mr_shop mm_shop mr_mrr" match2 = re.match(mszfc, neirong2, re.I) print(match2) # 这里返回none,这是因为match方法默认从字符串开始位置开始匹配,当第一个字符不符合条件的时候就直接不再继续了 print('匹配值或者叫匹配结果的开始位置:', match.start()) print('匹配值的结束位置:', match.end()) print('匹配位置的元组:', match.span()) print('要进行的匹配内容或者叫匹配数据:', match.string) print('匹配值/匹配数据/匹配结果:', match.group()) # 使用search(pattern,string,[flags])方法进行匹配,在整个字符串中搜索第一个匹配值,找到就返回Match对象,否则返回None。同上面的标志参数 cssearch = re.search(mszfc, neirong, re.I) cssearch2 = re.search(mszfc, neirong2, re.I) print(cssearch) print(cssearch2) csfindall = re.findall(mszfc, neirong, re.I) csfindall2 = re.findall(mszfc, neirong2, re.I) print(csfindall) print(csfindall2) # !!!尝试失败,1、第一格IP没找到;2、for的原理再理解下 IPpattern = r'[1-9]{1,3}(\.[0-9]{1,3}){3}' IPstr = '220.112.243.66 192.168.0.153 255.255.255.0 192.168.0.1' IPmatch = re.findall(IPpattern, IPstr) print(IPmatch) # 因为有分组的存在,这样直接干是会只拿到分组里的结果 就是(\.[0-9]{1,3})的内容 IPpattern2 = r'([1-9]{1,3}(\.[0-9]{1,3}){3})' IPmatch2 = re.findall(IPpattern2, IPstr) print(IPmatch2) for i in IPmatch2: print(i[0]) # 替换禁止字眼 ban = r'(英雄联盟)|(王者荣耀)|(CF穿越火线)|(DNF地下城与勇士)' saygame= input('你喜欢哪些游戏?') Gsub = re.sub(ban,'***',saygame) print(Gsub) URpattern = r'[&|?|/]' urlin = input('这个网站URL的中的各种请求或参数:') URsp = re.split(URpattern,urlin) print(URsp)
第九章、函数
把一段实现某功能的代码定义为一个函数,当需要使用的时候,进行调用使用,这样就可以重复使用,提高开发效率
创建调用函数
定义函数,使用关键字def实现: def functionname(parameterlist): '''函数的注释''' functionbody parameterlist 可选参数,用于指定向函数中传递的参数。如果有多个参数则用,号分隔 comments 可选参数,表示为函数指定注释,注释的内容通常为该函数的功能、要传递的参数的作用等
调用函数,执行函数工具: functionname(parameterlist)
参数
参数从主调函数中传递到被调函数(即被定义者),由被调函数对接收到的数据进行具体操作
形式参数 --在定义函数时,函数名后面括号中的参数为形式参数
实际参数 --在调用一个参数时,在函数名后括号中的参数为实际参数
位置参数 --必备参数,指必须按照正确的顺序传到函数中,即调用时的数量和位置必须和定义时一致
在调用函数时,指定的实际参数的数量必须与形式参数的数量一致,否则将抛出异常
在调用函数时,指定的实际参数的位置必须与形式参数的位置一致,否则将抛出异常或产生不符合预期的结果
关键字参数 --使用形式参数的名字来确定输入的参数值,就是类似说A参数就是这个值的,然后这个A参数的实际位置和形式参数不一样也没关系
参数默认值 --如果在调用的时候,没有指定某个参数的值就会抛出异常,但有时候我就是不需要输入这个值或者不知道这个值,这时候采用参数的默认值设置就可以解决没有输入值而导致异常的情况 --给参数设置默认值,就是给形式参数 = 号赋值一个初始数据 --而在形式参数的小括号中,有了默认值的参数,必须放在最后面,否则将产生语法错误
可变参数 --也称不定长参数,即传入函数中的实际参数可以是零个、一个、两个到任意个
定义时有两种形式
*参数名 ---表示接收任意多个实际参数,并放在一个元组中
如果想让一个已经存在的列表作为可变参数, 那就在实际调用的时候,在列表或列表名前加上*
**参数名 ---表示接收任意多个类似关键字参数一样,显式赋值的实际参数,并将其放到一个字典中
如果想让一个已经存在的字典作为可变参数, 那就在实际调用的时候,在列表或列表名前加上*
返回值
即使用函数后,外界所能得到的反馈或结果
在函数体内使用retrun语句进行返回值设定
变量的作用域 -指程序代码能够访问该变量的区域,如果超出范围再访问,就会出现错误
当全局变量和局部变量重名时,对函数体内的变量赋值后,不影响函数外的变量值
局部变量 --指在函数内部定义并使用的的变量
全局变量 --指在函数内外斗可以使用的变量
在函数外定义的变量是全局变量
在函数内定义的变量,使用global关键字修饰后,该变量也变成了全局变量
匿名函数 -指没有名字的函数,应用在一个需要函数但又不想去想名字的一次性使用场合
result = lambda [arg1 [,arg2, ……, argn]]:expression result 是用于调用lambda表达式 arg 是可选参数 expression 是必选参数,用于指定一个实现具体功能的表达式
它的首要用途是指定短小的回调函数
def dangerWord(string): '''功能:过滤关键字眼,并在过滤后将结果进行输出''' import re ban = r'(英雄联盟)|(王者荣耀)|(穿越火线)|(地下城与勇士)|(CF)|(DNF)' sub_ban = re.sub(ban, '***', string) # 这里将返回的参数按照上一行的关键来进行处理 print(sub_ban) textinp = input('你喜欢什么游戏呀?') dangerWord(textinp) # 例子:模拟顾客结账的部分功能——计算优惠后的实付金额 def fun_checkout(money): ''' 满500九点五折 满1000九折 满2000八点五折 满4000八折 :param money: :return: ''' money_yuanfu = sum(money) # 计算应付总金额 money_shiji = money_yuanfu if 500 <= money_yuanfu < 1000: money_shiji = '{:.2f}'.format(money_yuanfu * 0.95) elif 1000 <= money_yuanfu < 2000: money_shiji = '{:.2f}'.format(money_yuanfu * 0.9) elif 2000 <= money_yuanfu < 4000: money_shiji = '{:.2f}'.format(money_yuanfu * 0.85) elif 4000 <= money_yuanfu: money_shiji = '{:.2f}'.format(money_yuanfu * 0.8) return money_yuanfu, money_shiji # 返回应付总金额和实付总金额 # 调用函数测试: print('开始结算……') list_money = [] while True: inmoney= float(input('请输入商品金额\t(输入0代表输入完毕):')) if int(inmoney)== 0: break else: list_money.append(inmoney) money=fun_checkout(list_money) print('合计金额:',money[0],'\n 应付金额',money[1]) # 因为返回值只有两个,组成了一个元组,这个时候就是要索引进行函数名的取值
第十章、面向对象程序设计
什么是面向对象
面向对象(object Oriented)的英文缩写是OO,它是一种设计思想。 -从组织结构上模拟客观世界的方法
对象object: 万物皆可对象 --通常对象分为两个部分
静态部分:属性,客观存在
动态部分:行为,对象的动作
封装→类
类
具有相同属性和行为的一类实体被称为类
对象就是类的实例
面向对象程序设计的特点
封装 --面向对象编程的核心思想,将对象的属性和行为封装起来,而封装的载体就是类,类通常对客户隐藏其实现的细节,这就是封装的思想。 --保证了类内部数据结构的完整性,避免外部对内部数据的影响,提高了代码的可维护性。
继承
子承父业 --子类继承了父类、超类的属性和行为 --子类是父类的实例
多态
将父类对象应用于子类的特征就是多态 --一个老爸,多个儿子 --树状态
类的定义和使用
定义: 在Python中,类表示具有相同属性和方法的对象的结合。
使用class关键字实现: class ClassName: '''类的注释''' statement
statement:类体,主要由类变量或类成员、方法和属性等定义语句组成
使用: 在使用类时,需要先定义类,然后创建类的实例,在通过类的实例访问调用类中的属性和方法
创建类的实例: class语句本身并不创建该类的任何实例 ClassName(parameterlist)
parameterlist是可选参数,当创建一个类时,没有创建__init__()方法,或者__init__()方法只有一个self参数时,parameterlist可以省略
在创建类后,通常会创建一个__init__()方法。
该方法是一个特殊的方法,类似Java语言中的构造方法
每当创建一个类的新实例时,Python都会自动执行它
这个方法必须包含一个self参数,并且必须是第一个参数
self参数是一个指向实例本身的引用,用于访问类中的属性和方法
在方法调用时会自动传递实际参数self
类的成员: 类的成员主要由实例方法和数据成员组成 在类中创建了类的成员后,可以通过类的实例进行访问
创建实例方法并访问: --所谓实例方法,就是指类中定义的函数。 语法: class 类名: …… def 定义函数即实例方法(self,parameterlist): 方法体 ……
self是必要参数,表示类的实例;parameterlist是可选参数
实例方法和函数的区别: 函数实现的是某个独立的功能 而实例方法是实现类中的一个行为,是类的一部分
实例方法创建完成后,可以通过类的实例名称和点(.)操作符进行访问 实例名称.调用的类里的实例方法名称(方法指定对应的实际参数)
创建数据成员并访问: --数据成员是指在类中定义的变量,即属性 --根据您定义位置,又可以分为类属性和实例属性
类属性: ---指定义在类中,但在函数外的属性,可以在类的所有实例之间共享值 ---类属性可以通过类名称或者实例名访问
在Python中除了可以通过类名称访问类属性,还可以动态地为类和对象添加属性,也就是在使用的场合中,临时添加一个进去进行使用
除了动态添加,还可以修改类属性,修改结果将作用于该类的所有实例
实例属性: ---指定义在类的方法中的属性,只作用于当前实例中。 ---实例属性只能通过实例名访问,如果通过类名访问实例属性,将抛出异常
---对于实例属性,可以通过实例名称修改 ---与类属性不同,通过实例名称修改实例属性后,并不影响该类的另一个实例中相应的实例属性的值。
访问限制: 在类内部可以定义属性和方法,而在类的外部则可以直接调用属性或方法来操作数据,从而隐藏类内部的复杂逻辑。 但是Python并没有对属性和方法的访问权限进行限制。 为了保证类内部的属性或方法不被外部访问,可以在属性或方法名前面添加单下划线(_name)、双下划线(__name)、首尾加双下划线(__name__),从而限制访问权限。
以单下划线开头的表示protected 保护类型的成员,只允许类本身和子类进行访问,但不能使用“from module import *”语句导入
保护属性可以通过实例名访问
以双下划线表示private 私有类型的成员,只允许定义该方法的类本身进行访问,而且不能通过类的实例进行访问,但可以通过“类的实例名.类名__name”方式访问
即可以在中间加入类名进行访问,不能直接访问
前后双下划线的,表示定义特殊方法,一般是系统定义名字,如__init__()
属性
与类属性、实例属性不同: 类属性、实例属性将返回所存储的值, 而这里的属性,访问它时将计算它的值
通过 @property 这一个装饰器将方法转换为属性,从而实现用于计算的属性。
转换后,可以直接通过方法名来访问方法,而不需要添加一对小括号()
通过@property转换后的属性不能重新赋值,否则将抛出异常
添加安全保护机制: 在Python中,默认下,创建的类属性或者实例是可以在类体外进行修改的,如果要限制其不能在类体外修改,可以将其设置为私有的,但设置为私有后,在类体外也不能获取它的值
如果要创建一个既可以被读取,且又不能被修改的属性,那就可以使用@property实现只读属性
通过属性不仅可以将属性设置为只读属性,而且可以为属性设置拦截器,即允许对属性进行修改,但修改时需要遵守一定的约束。
继承
定义:
子承父业
父类or基类-----------→子类或者派生类
在程序设计中实现继承,表示这个类拥有它继承的类的所有公有成员或者受保护成员。
在Python中,可以在类定义语句中,类名右侧使用一对小括号将要继承的基类名称括起来,从而实现类的继承: class 类名(父类名字): ……
方法重写:
基类的成员都会被派生类继承,当基类方法不完全适用于派生类时,就需要在派生类中重写父类的方法,和Java中的方法重写一样。
就是在派生类内,重新写一遍同方法名的,但内部逻辑不一样的方法
派生类中调用基类的__init__()方法:
在派生类中定义__init__()方法时,不会自动调用基类的__init__()方法
要让派生类调用__init__()方法进行必要的初始化,需要在派生类使用super()函数调用基类的__init__()方法。
就是在派生类调用了__init__()方法的内柔后的下一行,添加 super().__init__(),对基类方法的调用
第十一章、模块
什么是模块
模块【Modules】
就相当于一个打包了基础运行功能的模块化组件,提供了移动的操作功能可以给其他代码进行调用
创建:
一个“文件名.py”就是一个模块
调用:
使用import语句导入模块: import 模块名 [as 在调用这里的别名]
添加前缀
在调用模块中的变量、函数或者类时,需要在变量名、函数名或者类名前添加“模块名.”作为前缀
如果不添加前缀,可以使用“from……import”语句进行导入: from 模块名 import 要导入的变量、函数或者类
在使用这个语句导入模块的定义时,。要保证所导入的内容在当前的命名空间中是唯一的,否则会出现冲突,后导入的同名变量、函数或者类会覆盖优先导入的
使用import语句还可以一次性导入多个模块,使用“,”逗号将模块名隔开
模块搜索目录: 当使用import语句导入模块时,默认情况下,会按照以下顺序进行查找。
1、在当前目录(即执行的Python脚本文件所在目录)下查找。 2、到PYTHONPATH(环境变量)下的每个目录查找。 3、到Python的默认安装目录下查找
以上各个目录的具体位置保存在标准模块sys的sys.path变量中。
当找不到模块时,可以用以下三种方法添加指定的目录到sys.path中
1、临时添加:例如E盘的asd文件夹目录 import sys sys.path.append(E:/asd) 通过该方法添加的目录只在执行当前文件的窗口有效,窗口关闭即失效
【推荐】2、增加.pth文件: 在Python安装目录下的lib\site-packages子目录中,创建添加一个拓展名为.pth文件,文件名任意,在该文件中添加要导入模块所在目录的绝对路径
3、在PYTHONPATH环境变量中添加
这两种方法,都需要重新打开要执行的导入模块的Python文件进行刷新
Python中的包结构
使用模块可以避免函数名和变量名重名引发的冲突。那么,如果模块名重复应该怎么办? 在Python中,提出了包(Package)概念。 包: 一个分层次的目录结构,它将一组功能相近的模块组织在一个目录下。 这样,既可以起到规范代码的作用,又能避免模块名重名引起的冲突。
简单理解,就是文件夹,不过这文件夹里必须要存在一个“__init__.py”的文件
使用包:
import 完整包名.模块名 调用模块中的内容时,要添加完整包名.模块名的前缀
from 完整包名 import 模块名 不需要包名前缀,但需要模块名前缀
from 完整包名.模块名 import 要使用的定义名 这个就不需要前缀
在每个模块的定义中都包括一个记录模块名称的变量 __name__ , 程序可以检查该变量,以确定它们在哪个模块中执行。 如果一个模块不是被导入其他程序中执行,那么它可能在解释器的顶级模块中执行。 顶级模块的 __name__ 变量的值为 __main__ 。
引用其他模块
标准模块
第三方模块
第十二章、异常处理及程序调试
什么是异常?
在程序运行过程中,经常会遇到各种各样的错误,这些错误统称为“异常”
例如,关键字错误 SyntaxError:invalid syntax 无效的语法
异常处理语句
try …… except 语句: try: 有可能异常的代码块 except [ExceptionName [as alias]]: 当出现异常时才运行的代码块 ExceptionName——可选参数,用于指定要捕获的异常 可同时处理多个异常——语法有二:参考if……elif……else语句或多参数
try …… except …… else 语句: 用于指定当try语句块中没有发现异常时要执行的语句块。 该语句块中的内容,当try语句块中发现异常时将不被执行。
try …… except …… finally 语句: try: 有可能异常的代码块 except [ExceptionName [as alias]]: 当出现异常时才运行的代码块 finally: 程序中在任何情况下都必须执行的语句的代码块 完整的异常处理语句应该包含finally代码块, 通常情况下,无论程序中有无异常产生,finally代码块中的代码都会被执行
如果某个函数或方法可能会产生异常,但不想在当前函数或方法中处理这个异常, 则可以使用raise语句在函数或者方法中抛出异常
程序调试
断点
后续再继续研究
断言 使用assert语句调试程序:————如果表达式的值为真,什么都不做;如果为假,则抛出AssertionError异常 assert 判断条件表达式 ,[可选,用于对判断条件进行描述,为了以后更好地知道哪里出现了问题]
第十三章、文件及目录操作
概述: 在变量、序列和对象中存储的数据是暂时的,程序结束后就会丢失。 为了能够长时间地保存程序中的数据,需要将程序中的数据保存到磁盘文件中。 Python中提供了内置的文件对象和对文件,以及目录进行操作的内置模块。 通过这些技术可以很方便地将数据保存到文件(如文本文件等)中,以达到长时间保存数据的目的。
基本文件操作
创建、打开: file = open(filename[,mode[,buffering]]) file : 被创建的文件对象 filename : 要创建或打开文件的文件名称,需要使用单引号或双引号括起来。 【如果要打开的文件和当前文件在同一目录下,直接下文件名即可,否则要写绝对路径。】 mode : 可选参数,用于指定文件的打开模式 buffering : 可选参数,用于指定读写文件的缓冲模式,值为0表示不缓存;值为1表示缓存,如果大于1则表示缓冲区大小。默认缓冲。
'r' : 以只读模式打开 'r+' : 以读写模式打开, 写的指针刚开始指在文件开头, 因此会覆写文件 'w' : 清空文件, 不能使用 <file>.read*() 方法. (read(), readline(), readlines()) 'w+' : 清空文件, 可以使用 <file>.read*() 方法. 'a' : 向一个文件追加内容, 不能使用 .read*() 'a+' : 向一个文件追加内容, 可以使用 .read*() 'rU' : 自动探测行尾符, 如果以这种模式打开一个文件, 该文件对象将获得一个 newlines 属性, 当还未读到任何行尾时, <file>.newlines 属性等于 None, 读到了则可能是'\n', '\r\n', '\r' 中的一种.
open()方法经常实现以下几个功能:
1、打开一个不存在的文件时,先创建该文件
2、以二进制形式打开文件
创建生成的是一个BufferedReader对象。
生成后,可以再应用其他的第三方模块进行处理
3、打开文件时指定编码方式
关闭文件: file.close() 打开文件后需要及时关闭,以免对文件造成不必要的破坏。 关闭文件可以使用文件对象的close()方法实现。 该方法先刷新缓冲区中还没有写入的信息,然后再写关闭文件,这样可以将没有写入文件的内容写入文件中。 在关闭文件后,便不能再进行写入操作。
打开文件时使用with语句: 如果在打开文件时抛出了异常,那么将导致文件不能被及时关闭。 为了避免这样的情况,可以使用Python提供的with语句, 从而实现在处理文件时,无论是否抛出异常,都能保证with语句执行完毕后关闭已经打开的文件。 with expression as target: with-body expression : 用于指定一个表达式,这里可以是打开文件的open()函数 target : 用于指定一个变量,并且将expression的结果保存到该变量中 with-body : 用于指定with语句体,其中可以是执行语句后相关的一些操作语句。如果不想执行任何语句,可以直接使用pass语句代替。 例如: file = open('测试.txt','w') 使用with语句后: with open('测试.txt','w') as file: pass
写入文件内容: file.write(string) file:打开的文件对象 string:要写入的字符串
在调用write()方法向文件中写入内容的前提是: 打开文件时,指定的打开模式为w或者a, 否则,将抛出异常。
在向文件中写入内容后,如果不想马上关闭文件,也可以调用文件对象提供的flush()方法,把缓冲区的内容写入文件。
除了write()方法,Python的文件对象还提供了writelines()方法, 可以把字符串列表写入文件,但是不添加换行符。
读取文件:
1、读取指定字符: file.read([size]) size:可选参数,用于指定要读取的字符个数,如果省略则一次性读取所有内容
前提: 打开文件时,指定的打开模式为r或者r+
这个方法是从文件的开头读取的,如果想要读取部分内容,可以先使用文件对象的seek()方法将文件的指针移动到新的位置,然后再应用read(size)方法读取。 file.seek(offset[,whence]) offset:用于指定移动的字符个数,其具体位置与whence有关 whence:用于指定从什么位置开始计算。值为0表示从文件头开始计算,1表示从当前位置开始计算,2表示从文件尾开始计算,默认0。
对于whence参数,如果在打开文件时没有使用b模式(即rb), 那么只允许从文件头开始计算相对位置,从文件尾计算时就会引发异常。
2、读取一行: 在使用read()方法读取文件时,如果文件很大,一次读取全部内容到内存,容易造成内存不足,所以通常会采取逐行读取。 文件对象提供了readline()方法用于每次读取一行数据: file.readline()
前提: 打开文件时,指定的打开模式为r或者r+
3、读取全部行: file.readlines() 读取全部行时,返回的是一个字符串列表,每个元素为文件的一行内容
前提: 打开文件时,指定的打开模式为r或者r+
目录操作
目录也称文件夹,用于分层保存文件。 通过目录可以分门别类地存放文件。 在Python中,并没有提供直接操作目录的函数或者对象, 而是需要使用内置的os和os.path模块实现。
os和os.path模块: 使用import语句导入
os模块
os模块的常用变量: name:用于获取操作系统类型 linesep:用于获取当前操作系统上的换行符 sep:用于获取当前操作系统上的路径分隔符

os.path模块

判断目录是否存在
使用os.path模块的exists()函数实现: os.path.exists(path) path:表示要判断的目录,绝对路径或相对路径
创建目录
在os模块中提供了两个创建目录的函数
创建一级目录: os.mkdir(path,mode=O0777) path:用于指定要创建的目录,绝对路径或相对路径 mode:用于指定数值模式,默认值为O0777 如果创建的路径已经存在,则抛出FileExistsError异常
创建多级目录: os.makedirs(name,mode=O0777) name:用于指定要创建的目录,绝对路径或相对路径
如果指定的目录有多级,而且最后一级的上级目录有不存在的, 则抛出FileNotFoundError异常,并且创建不成功。 要解决这个问题有两个方法:
使用多级创建目录方法
编写递归函数调用os.mkidr()函数实现
删除目录
os.rmdir(path)
如果要删除的路径已经不存在,则抛出“FileExistsError:[WinError 2]系统找不到指定的文件”的异常
只能删除空的目录: 个人理解就是,只能删除一级目录
如果要删除非空目录,则需要使用Python内置的标准模块shutil的rmtree()函数实现
遍历目录
os模块的walk()函数用于实现遍历目录的功能: os.walk(top,[,topdown][,onerror][,followlinks]) top:用于指定要遍历内容的根目录 topdown:可选,用于指定遍历顺序,True从根目录开始,False从最小(子)目录开始 onerror:可选,用于指定错误处理方式 followlinks:可选,默认walk()函数不会向下(向着子目录)转换成解析到目录的符号链接,设置为True时,表示用于指定在支持的系统上访问由符号链接指向的目录
返回值:返回一个包含三个元素(dirpath,dirnames,filenames)的元组生成器对象。 dirpath:表示当前遍历的路径,是一个字符串 dirnames:表示当前路径下包含的子目录,是一个列表 filenames:表示当前路径下包含的文件,是一个列表
高级文件操作

删除文件
Python没有内置删除文件的函数,但是在内置的os模块中提供了删除文件的函数remove() os.remove(path) 如果要删除文件不存在时,会抛出“FileExistsError:[WinError 2]系统找不到指定的文件”的异常
重命名文件和目录
os模块提供了rename()函数,可以操作目录和文件: os.rename(src,dst) src:要重命名的文件或者目录 dst:重命名后的文件或目录
获取文件基本信息
os.stat(path) stat()函数返回值是一个对象,通过访问以下属性,可以获取文件的基本信息: 
第十四章、操作数据库
数据库编程接口
数据库连接对象(connection object): 主要提供获取数据游标对象和提交/回滚事务的方法,以及关闭数据库连接
如何链接对象: 使用connect()函数 
连接对象的方法: connect()函数返回连接对象 
以具体所使用的数据库为准来使用参数
游标对象(cursor object): 代表数据库中的游标,用于指示抓取数据操作的上下文。 主要提供执行SQL语句、调用存储过程、获取查询结果
如何获取游标对象? 通过使用连接对象的cursor()方法,可以获取到游标对象。 
SQLite
SQLite不是一个客户端/服务器结构的数据库引擎,而是一种嵌入式数据库,它的数据库就是一个文件。 因为SQLite是使用C语言写的,体积小,所以经常被集成到各种应用程序中。所以Python中使用SQLite,不需要安装任何模块,直接使用。
创建数据库:
Python操作数据库的通用的流程如图: 
重点
操作SQLite:使用以下SQL语句
新建数据
insert into 表名(字段名1,字段名2……字段名n) values (字段值1,字段值2……字段值n)
查询数据
select 字段名1,字段名2,字段名3…… from 表名 where 查询条件 查询数据时,通常使用以下3种方法:
fetchone():获取查询结果集中的下一条记录
fetchmany():获取指定数量的记录
fetchall():获取结果集的所有记录
类似调用方法或函数
修改数据
update 表名 set 字段名 = 字段值 where 查询条件
删除数据
delete from 表名 where 查询条件
import sqlite3 # 链接数据库 # 链接mrsoft.db数据库,如果不存在就自动在本地目录创建 conn = sqlite3.connect('mrsoft.db') # 创建一个cursor 一个游标,定义上类似一个操作平台 curs = conn.cursor() # 删除数据 delete from 表 where 查询条件 curs.execute('delete from user where id = ?',(3,)) curs.execute('select * from user') result6 = curs.fetchall() print('二人世界:',result6) curs.close() conn.commit() conn.close() # # 更新数据 update # curs.execute('update user set name = ? where id = ?',('莫玉流',1)) # curs.execute('select * from user') # result5 = curs.fetchall() # print('更新后的数据为:',result5) # curs.close() # conn.commit() # conn.close() # # # # 查看数据表内容 # # # !!!使用占位符?的方式,可以避免SQL注入的风险 # # curs.execute('select * from user where id > ?', (1,)) # 查询id值1之后的数据 # # result4 = curs.fetchall() # # print(result4) # # # curs.execute('select * from user ') # # # result1 = curs.fetchone() # # # print('fetchone方法获取到:',result1) # # # result2 = curs.fetchall() # # # print('fetchall方法获取到:',result2) # # # result3 = curs.fetchmany(2) # # # print('fetchmany方法获取到:',result3) # # # curs.close() # # # conn.close() # # ''' # # fetchone方法获取到: (1, 'MOYULIU') # # fetchall方法获取到: [(2, 'Hexingying'), (3, 'ourhome')] # # fetchmany方法获取到: [] # # ''' # # # # # # 新增数据到user表,由于是新增——需要使用commit()方法提交事务:因为,对于增、删、改的操作,使用commit()方法后,如果操作失败,可以使用rollback()方法回滚到操作前的状态。 # # # curs.execute('insert into user (id,name ) values ("1","MOYULIU")') # # # curs.execute('insert into user (id,name ) values ("2","Hexingying")') # # # curs.execute('insert into user (id,name ) values ("3","ourhome")') # # # curs.close() # # # conn.commit() #提交事务 # # # conn.close() # # # # # # # # 执行一条SQL语句,创建一个user表 # # # # curs.execute('create table user(id int(10) primary key,name varchar(20))') # # # # # # # # # 关闭游标,关闭链接 # # # # curs.close() # # # # conn.close()
MySQL
一切尽在代码中:
链接数据库,检查版本:
import pymysql # 检查数据库是否链接,输入当前数据库版本 db = pymysql.connect(host="localhost", user="root", password="123456", database="stupy") cursor = db.cursor() cursor.execute("SELECT VERSION()") data = cursor.fetchone() print("数据库版本:%s"% data) db.close()
创建数据表【判断是否存在目标表,】:
import pymysql db = pymysql.connect(host="localhost", user="root", password="123456", database="stupy") cursor = db.cursor() cursor.execute("DROP TABLE IF EXISTS book") sql = """ CREATE TABLE book( id int(8) NOT NULL AUTO_INCREMENT, name VARCHAR(50) NOT NULL, number VARCHAR(20) NOT NULL , category VARCHAR(50) NOT NULL, price DECIMAL(10,2) DEFAULT NULL, publish_time date DEFAULT NULL, PRIMARY KEY(id) )ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; """ cursor.execute(sql) db.close()
批量导入数据:
import pymysql db = pymysql.connect(host="localhost", user="root", password="123456", database="stupy",charset="utf8") # 需要注意额外设置的字符集charset="utf8",这样插入中文的时候才不会出错 cursor = db.cursor() data = [("张珊珊", "764542671", '1', '2', '2021-01-30 '), ("李思思", "725154808", '3', '4', '2021-01-30 '), ("王五五", "827216650", '5', '8', '2021-01-30 '), ("李柳", "711137099", '6', '9', '2021-01-30 '), ("张珊珊", "622541562", '7', '0', '2021-01-30 '), ] try: cursor.executemany("insert into book(name,number,category,price,publish_time)values (%s,%s,%s,%s,%s)", data) db.commit() except: db.rollback() db.close()
import pymysql import random class DatabaseAccess(): # 初始化属性 def __init__(self): self.__db_host = "localhost" self.__db_port = 3306 self.__db_user = "root" self.__db_password = "123456" self.__db_database = "stupy" # 链接数据库 def isConnectionOpen(self): self.__db = pymysql.connect( host=self.__db_host, port=self.__db_port, user=self.__db_user, password=self.__db_password, database=self.__db_database, charset='utf8' ) # 插入数据 def linesinsert(self, names, ages): try: # 连接数据库 self.isConnectionOpen() # 创建游标 global cursor cursor = self.__db.cursor() # sql命令 sql = "insert into student(name,age) value(%s,%s)" # 执行sql命令 cursor.execute(sql, (names, ages)) except Exception as e: print(e) finally: # 关闭游标 cursor.close() # 提交 self.__db.commit() # 关闭数据库连接 self.__db.close() # 数据生成,姓名,年龄,并调用数据插入方法 def data_update(self): ret1 = random.choice(lst_first) ret2 = random.choice(lst_last) ret3 = random.choice(lst_last) name = ret1 + ret2 + ret3 age = random.randint(18, 25) self.linesinsert(name, age) lst_first = [ '赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '卫', '蒋', '沈', '韩', '杨', '朱', '秦', '尤', '许', '何', '吕', '施', '张', '孔', '曹', '严', '华', '金', '魏', '陶', '姜', '戚', '谢', '邹', '喻', '柏', '水', '窦', '章', '云', '苏', '潘', '葛', '奚', '范', '彭', '郎', '鲁', '韦', '昌', '马', '苗', '凤', '花', '方', '俞', '任', '袁', '柳', '酆', '鲍', '史', '唐', '费', '廉', '岑', '薛', '雷', '贺', '倪', '汤', '滕', '殷', '罗', '毕', '郝', '邬', '安', '常', '乐', '于', '时', '傅', '皮', '卞', '齐', '康', '伍', '余', '元', '卜', '顾', '孟', '平', '黄', '和', '穆', '萧', '尹', '姚', '邵', '堪', '汪', '祁', '毛', '禹', '狄', '米', '贝', '明', '臧', '计', '伏', '成', '戴', '谈', '宋', '茅', '庞', '熊', '纪', '舒', '屈', '项', '祝', '董', '梁'] lst_last = [ '的', '一', '是', '了', '我', '不', '人', '在', '他', '有', '这', '个', '上', '们', '来', '到', '时', '大', '地', '为', '子', '中', '你', '说', '生', '国', '年', '着', '就', '那', '和', '要', '她', '出', '也', '得', '里', '后', '自', '以', '会', '家', '可', '下', '而', '过', '天', '去', '能', '对', '小', '多', '然', '于', '心', '学', '么', '之', '都', '好', '看', '起', '发', '当', '没', '成', '只', '如', '事', '把', '还', '用', '第', '样', '道', '想', '作', '种', '开', '美', '总', '从', '无', '情', '己', '面', '最', '女', '但', '现', '前', '些', '所', '同', '日', '手', '又', '行', '意', '动', '方', '期', '它', '头', '经', '长', '儿', '回', '位', '分', '爱', '老', '因', '很', '给', '名', '法', '间', '斯', '知', '世', '什', '两', '次', '使', '身', '者', '被', '高', '已', '亲', '其', '进', '此', '话', '常', '与', '活', '正', '感', '见', '明', '问', '力', '理', '尔', '点', '文', '几', '定', '本', '公', '特', '做', '外', '孩', '相', '西', '果', '走', '将', '月', '十', '实', '向', '声', '车', '全', '信', '重', '三', '机', '工', '物', '气', '每', '并', '别', '真', '打', '太', '新', '比', '才', '便', '夫', '再', '书', '部', '水', '像', '眼', '等', '体', '却', '加', '电', '主', '界', '门', '利', '海', '受', '听', '表', '德', '少', '克', '代', '员', '许', '稜', '先', '口', '由', '死', '安', '写', '性', '马', '光', '白', '或', '住', '难', '望', '教', '命', '花', '结', '乐', '色', '更', '拉', '东', '神', '记', '处', '让', '母', '父', '应', '直', '字', '场', '平', '报', '友', '关', '放', '至', '张', '认', '接', '告', '入', '笑', '内', '英', '军', '候', '民', '岁', '往', '何', '度', '山', '觉', '路', '带', '万', '男', '边', '风', '解', '叫', '任', '金', '快', '原', '吃', '妈', '变', '通', '师', '立', '象', '数', '四', '失', '满', '战', '远', '格', '士', '音', '轻', '目', '条', '呢', '病', '始', '达', '深', '完', '今', '提', '求', '清', '王', '化', '空', '业', '思', '切', '怎', '非', '找', '片', '罗', '钱', '紶', '吗', '语', '元', '喜', '曾', '离', '飞', '科', '言', '干', '流', '欢', '约', '各', '即', '指', '合', '反', '题', '必', '该', '论', '交', '终', '林', '请', '医', '晚', '制', '球', '决', '窢', '传', '画', '保', '读', '运', '及', '则', '房', '早', '院', '量', '苦', '火', '布', '品', '近', '坐', '产', '答', '星', '精', '视', '五', '连', '司', '巴', '奇', '管', '类', '未', '朋', '且', '婚', '台', '夜', '青', '北', '队', '久', '乎', '越', '观', '落', '尽', '形', '影', '红', '爸', '百', '令', '周', '吧', '识', '步', '希', '亚', '术', '留', '市', '半', '热', '送', '兴', '造', '谈', '容', '极', '随', '演', '收', '首', '根', '讲', '整', '式', '取', '照', '办', '强', '石', '古', '华', '諣', '拿', '计', '您', '装', '似', '足', '双', '妻', '尼', '转', '诉', '米', '称', '丽', '客', '南', '领', '节', '衣', '站', '黑', '刻', '统', '断', '福', '城', '故', '历', '惊', '脸', '选', '包', '紧', '争', '另', '建', '维', '绝', '树', '系', '伤', '示', '愿', '持', '千', '史', '谁', '准', '联', '妇', '纪', '基', '买', '志', '静', '阿', '诗', '独', '复', '痛', '消', '社', '算', '义', '竟', '确', '酒', '需', '单', '治', '卡', '幸', '兰', '念', '举', '仅', '钟', '怕', '共', '毛', '句', '息', '功', '官', '待', '究', '跟', '穿', '室', '易', '游', '程', '号', '居', '考', '突', '皮', '哪', '费', '倒', '价', '图', '具', '刚', '脑', '永', '歌', '响', '商', '礼', '细', '专', '黄', '块', '脚', '味', '灵', '改', '据', '般', '破', '引', '食', '仍', '存', '众', '注', '笔', '甚', '某', '沉', '血', '备', '习', '校', '默', '务', '土', '微', '娘', '须', '试', '怀', '料', '调', '广', '蜖', '苏', '显', '赛', '查', '密', '议', '底', '列', '富', '梦', '错', '座', '参', '八', '除', '跑', '亮', '假', '印', '设', '线', '温', '虽', '掉', '京', '初', '养', '香', '停', '际', '致', '阳', '纸', '李', '纳', '验', '助', '激', '够', '严', '证', '帝', '饭', '忘', '趣', '支', '春', '集', '丈', '木', '研', '班', '普', '导', '顿', '睡', '展', '跳', '获', '艺', '六', '波', '察', '群', '皇', '段', '急', '庭', '创', '区', '奥', '器', '谢', '弟', '店', '否', '害', '草', '排', '背', '止', '组', '州', '朝', '封', '睛', '板', '角', '况', '曲', '馆', '育', '忙', '质', '河', '续', '哥', '呼', '若', '推', '境', '遇', '雨', '标', '姐', '充', '围', '案', '伦', '护', '冷', '警', '贝', '著', '雪', '索', '剧', '啊', '船', '险', '烟', '依', '斗', '值', '帮', '汉', '慢', '佛', '肯', '闻', '唱', '沙', '局', '伯', '族', '低', '玩', '资', '屋', '击', '速', '顾', '泪', '洲', '团', '圣', '旁', '堂', '兵', '七', '露', '园', '牛', '哭', '旅', '街', '劳', '型', '烈', '姑', '陈', '莫', '鱼', '异', '抱', '宝', '权', '鲁', '简', '态', '级', '票', '怪', '寻', '杀', '律', '胜', '份', '汽', '右', '洋', '范', '床', '舞', '秘', '午', '登', '楼', '贵', '吸', '责', '例', '追', '较', '职', '属', '渐', '左', '录', '丝', '牙', '党', '继', '托', '赶', '章', '智', '冲', '叶', '胡', '吉', '卖', '坚', '喝', '肉', '遗', '救', '修', '松', '临', '藏', '担', '戏', '善', '卫', '药', '悲', '敢', '靠', '伊', '村', '戴', '词', '森', '耳', '差', '短', '祖', '云', '规', '窗', '散', '迷', '油', '旧', '适', '乡', '架', '恩', '投', '弹', '铁', '博', '雷', '府', '压', '超', '负', '勒', '杂', '醒', '洗', '采', '毫', '嘴', '毕', '九', '冰', '既', '状', '乱', '景', '席', '珍', '童', '顶', '派', '素', '脱', '农', '疑', '练', '野', '按', '犯', '拍', '征', '坏', '骨', '余', '承', '置', '臓', '彩', '灯', '巨', '琴', '免', '环', '姆', '暗', '换', '技', '翻', '束', '增', '忍', '餐', '洛', '塞', '缺', '忆', '判', '欧', '层', '付', '阵', '玛', '批', '岛', '项', '狗', '休', '懂', '武', '革', '良', '恶', '恋', '委', '拥', '娜', '妙', '探', '呀', '营', '退', '摇', '弄', '桌', '熟', '诺', '宣', '银', '势', '奖', '宫', '忽', '套', '康', '供', '优', '课', '鸟', '喊', '降', '夏', '困', '刘', '罪', '亡', '鞋', '健', '模', '败', '伴', '守', '挥', '鲜', '财', '孤', '枪', '禁', '恐', '伙', '杰', '迹', '妹', '藸', '遍', '盖', '副', '坦', '牌', '江', '顺', '秋', '萨', '菜', '划', '授', '归', '浪', '听', '凡', '预', '奶', '雄', '升', '碃', '编', '典', '袋', '莱', '含', '盛', '济', '蒙', '棋', '端', '腿', '招', '释', '介', '烧', '误', '乾', '坤'] if __name__ == "__main__": # 创建实例化对象 db = DatabaseAccess() # 循环100次,插入100条数据 for record in range(1, 101): # 调用方法 db.data_update()