时间:2021-07-01 10:21:17 帮助过:23人阅读
Tedu Python 教学部 |
---|
Author:吕泽 |
数据处理数据处理1. 文件处理1.1 引入1.2 文件读写操作1.2.1 打开文件1.2.2 读取文件1.2.3 写入文件1.2.4 关闭文件1.2.5 with操作1.2.6 缓冲区1.2.7 文件偏移量1.3 os模块2. 正则表达式2.1 概述2.2 元字符使用2.3 匹配规则2.3.1 特殊字符匹配2.3.2 贪婪模式和非贪婪模式2.3.3 正则表达式分组2.3.4 正则表达式匹配原则2.4 Python re模块使用2.4.1 基础函数使用2.4.2 生成match对象2.4.3 match对象使用2.4.4 flags参数扩展3. 数据库3.1概述3.2 MySQL3.3 SQL语言3.4 数据库管理3.5 数据表管理3.5.1 基础数据类型3.5.2 表的基本操作3.6 表数据基本操作3.5.1 插入(insert)3.6.2 查询(select)3.6.3 where子句3.6.4 更新表记录(update)3.6.5 删除表记录(delete)3.6.6 表字段的操作(alter)3.5.7 时间类型数据3.7 高级查询语句3.8 聚合操作3.8.1 聚合函数3.8.2 聚合分组3.8.3 聚合筛选3.8.4 去重语句3.8.5 聚合运算3.9 索引操作3.9.1 概述3.9.2 索引分类3.9.3 索引创建3.10 外键约束和表关联关系3.10.1 外键约束3.10.2 表关联设计3.10.3 E-R模型3.10.4 表连接3.11 视图3.12 函数和存储过程3.12.1 函数创建3.12.2存储过程创建3.12.3 存储过程和存储函数操作3.12.4 函数和存储过程区别3.13 事务控制3.13.1 事务概述3.13.2 事务操作3.13.3 事务四大特性3.13.4 事务隔离级别3.14 数据库优化3.14.1 数据库设计范式3.14.2 MySQL存储引擎3.14.3 字段数据类型选择3.14.4 键的设置3.14.5 explain语句3.14.6 SQL优化3.14.7 表的拆分3.15 数据库备份和用户管理3.15.1 表的复制3.15.2 数据备份3.15.3 用户权限管理3.16 pymysql模块
数据处理概述
数据处理的基本目的是从大量的、可能是杂乱无章的、难以理解的数据中抽取并推导出对于某些特定的人们来说是有价值、有意义的数据。当下数据处理贯穿于社会生产和社会生活的各个领域。数据处理技术的发展及其应用的广度和深度,极大地影响了人类社会发展的进程。数据处理也是大数据,数据分析等后续科学的基本环节。
基本概念
数据存储阶段
人工管理阶段:人为管理,没有固定的格式和存储方法,容易混乱。
文件管理阶段 :数据可以长期保存,存储数据量大,使用简单。
数据库管理阶段:高效,可以存储更大量数据,便于管理,更加专业。
什么是文件
文件是保存在持久化存储设备(硬盘、U盘、光盘..)上的一段数据,一个文本,一个py
文件,一张图片,一段视······ 这些都是文件。
文件分类
字节串类型
概念 : 在python3中引入了字节串的概念,与str不同,字节串以字节序列值表达数据,更方便用来处理二进程数据。
字符串与字节串相互转化方法
?x 1- 普通的英文字符字符串常量可以在前面加b转换为字节串,例如:b‘hello‘
2
- 变量或者包含非英文字符的字符串转换为字节串方法 :str.encode()
3
- 字节串转换为字符串方法 : bytes.decode()
4
?
5
注意:python字符串用来表达utf8字符,因为并不是所有二进制内容都可以转化为utf8字符,所以不是所有字节串都能转化为字符串,但是所有字符串都能转化成二进制,所以所有字符串都能转换为字节串。
使用程序操作文件,无外乎对文件进行读或者写
对文件实现读写的基本操作步骤为:打开文件,读写文件,关闭文件。
xxxxxxxxxx
7
1
file_object = open(file_name, access_mode=‘r‘, buffering=-1,encoding=None)
2
功能:打开一个文件,返回一个文件对象。
3
参数:file_name 文件名;
4
access_mode 打开文件的方式,如果不写默认为‘r’
5
buffering 1表示有行缓冲,默认则表示使用系统默认提供的缓冲机制。
6
encoding=‘UTF-8‘ 设置打开文件的编码方式,一般Linux下不需要
7
返回值:成功返回文件操作对象。
打开模式 | 效果 |
---|---|
r | 以读方式打开,文件必须存在 |
w | 以写方式打开,文件不存在则创建,存在清空原有内容 |
a | 以追加模式打开,文件不存在则创建,存在则继续进行写操作 |
r+ | 以读写模式打开 文件必须存在 |
w+ | 以读写模式打开文件,不存在则创建,存在清空原有内容 |
a+ | 追加并可读模式,文件不存在则创建,存在则继续进行写操作 |
rb | 以二进制读模式打开 同r |
wb | 以二进制写模式打开 同w |
ab | 以二进制追加模式打开 同a |
rb+ | 以二进制读写模式打开 同r+ |
wb+ | 以二进制读写模式打开 同w+ |
ab+ | 以二进制读写模式打开 同a+ |
注意 :
- 以二进制方式打开文件,读取内容为字节串,写入也需要写入字节串
- 无论什么文件都可以使用二进制方式打开,但是二进制文件则不能以文本方式打开,否则后续读写会报错。
xxxxxxxxxx
4
1
read([size])
2
功能: 来直接读取文件中字符。
3
参数: 如果没有给定size参数(默认值为-1)或者size值为负,文件将被读取直至末尾,给定size最多读取给定数目个字符(字节)。
4
返回值: 返回读取到的内容
注意:文件过大时候不建议直接读取到文件结尾,读到文件结尾会返回空字符串。
xxxxxxxxxx
4
1
readline([size])
2
功能: 用来读取文件中一行
3
参数: 如果没有给定size参数(默认值为-1)或者size值为负,表示读取一行,给定size表示最多读取制定的字符(字节)。
4
返回值: 返回读取到的内容
xxxxxxxxxx
4
1
readlines([sizeint])
2
功能: 读取文件中的每一行作为列表中的一项
3
参数: 如果没有给定size参数(默认值为-1)或者size值为负,文件将被读取直至末尾,给定size表示读取到size字符所在行为止。
4
返回值: 返回读取到的内容列表
xxxxxxxxxx
4
1
# 文件对象本身也是一个可迭代对象,在for循环中可以迭代文件的每一行。
2
?
3
for line in f:
4
print(line)
xxxxxxxxxx
4
1
write(data)
2
功能: 把文本数据或二进制数据块的字符串写入到文件中去
3
参数:要写入的内容
4
返回值:写入的字符个数
注意: 如果需要换行要自己在写入内容中添加\n
xxxxxxxxxx
3
1
writelines(str_list)
2
功能:接受一个字符串列表作为参数,将它们写入文件。
3
参数: 要写入的内容列表
打开一个文件后我们就可以通过文件对象对文件进行操作了,当操作结束后可以关闭文件操作
xxxxxxxxxx
1
1
file_object.close()
python中的with语句也可以用于访问文件,在语句块结束后会自动释放资源。
xxxxxxxxxx
2
1
with context_expression [as obj]:
2
with-body
xxxxxxxxxx
2
1
with open(‘file‘,‘r+‘) as f:
2
f.read()
注意 : with语句块结束后会自动释放f所以不再需要close().
定义
系统自动的在内存中为每一个正在使用的文件开辟一个空间,在对文件读写时都是先将文件内容加载到缓冲区,再进行读写。
作用
缓冲区设置
类型 | 设置方法 | 注意事项 |
---|---|---|
系统自定义 | buffering=-1 | |
行缓冲 | buffering=1 | 当遇到\n时刷新缓冲 |
指定缓冲区大小 | buffering>1 | 必须以二进制方式打开 |
刷新缓冲区条件
xxxxxxxxxx
1
1
file_obj.flush()
定义
打开一个文件进行操作时系统会自动生成一个记录,记录每次读写操作时所处的文件位置,每次文件的读写操作都是从这个位置开始进行的。
注意:
- r或者w方式打开,文件偏移量在文件开始位置
- a方式打开,文件偏移量在文件结尾位置
文件偏移量控制
xxxxxxxxxx
3
1
tell()
2
功能:获取文件偏移量大小
3
返回值:文件偏移量
xxxxxxxxxx
4
1
seek(offset[,whence])
2
功能: 移动文件偏移量位置
3
参数:offset 代表相对于某个位置移动的字节数。负数表示向前移动,正数表示向后移动。
4
whence是基准位置的默认值为 0,代表从文件开头算起,1代表从当前位置算起,2 代表从文件 末尾算起。
注意:必须以二进制方式打开文件时,基准位置才能是1或者2
os模块是Python标准库模块,包含了大量的文件处理函数。
xxxxxxxxxx
4
1
os.path.getsize(file)
2
功能: 获取文件大小
3
参数: 指定文件
4
返回值: 文件大小
xxxxxxxxxx
4
1
os.listdir(dir)
2
功能: 查看文件列表
3
参数: 指定目录
4
返回值:目录中的文件名列表
xxxxxxxxxx
4
1
os.path.exists(file)
2
功能: 查看文件是否存在
3
参数: 指定文件
4
返回值:存在返回True,不存在返回False
xxxxxxxxxx
4
1
os.path.isfile(file)
2
功能: 判断文件类型
3
参数: 指定文件
4
返回值:普通文件返回True,否则返回False
xxxxxxxxxx
3
1
os.remove(file)
2
功能: 删除文件
3
参数: 指定文件
即文本的高级匹配模式,其本质是由一系列字符和特殊符号构成的字串,这个字串即正则表达式。
通过普通字符和有特定含义的字符,来组成字符串,用以描述一定的字符串规则,比如:重复,位置等,来表达某类特定的字符串,进而匹配。
匹配规则:每个普通字符匹配其对应的字符
xxxxxxxxxx
3
1
e.g.
2
In : re.findall(‘ab‘,"abcdefabcd")
3
Out: [‘ab‘, ‘ab‘]
注意:正则表达式在python中也可以匹配中文
元字符: |
匹配规则: 匹配 | 两侧任意的正则表达式即可
xxxxxxxxxx
4
1
e.g.
2
In : re.findall(‘com|cn‘,"www.baidu.com/www.tmooc.cn")
3
Out: [‘com‘, ‘cn‘]
4
?
元字符:.
匹配规则:匹配除换行外的任意一个字符
xxxxxxxxxx
4
1
e.g.
2
In : re.findall(‘张.丰‘,"张三丰,张四丰,张五丰")
3
Out: [‘张三丰‘, ‘张四丰‘, ‘张五丰‘]
4
?
元字符: [字符集]
匹配规则: 匹配字符集中的任意一个字符
表达形式:
[abc#!好] 表示 [] 中的任意一个字符 [0-9],[a-z],[A-Z] 表示区间内的任意一个字符 [_#?0-9a-z] 混合书写,一般区间表达写在后面
xxxxxxxxxx
3
1
e.g.
2
In : re.findall(‘[aeiou]‘,"How are you!")
3
Out: [‘o‘, ‘a‘, ‘e‘, ‘o‘, ‘u‘]
元字符:[^字符集]
匹配规则:匹配除了字符集以外的任意一个字符
xxxxxxxxxx
3
1
e.g.
2
In : re.findall(‘[^0-9]‘,"Use 007 port")
3
Out: [‘U‘, ‘s‘, ‘e‘, ‘ ‘, ‘ ‘, ‘p‘, ‘o‘, ‘r‘, ‘t‘]
元字符: ^
匹配规则:匹配目标字符串的开头位置
xxxxxxxxxx
3
1
e.g.
2
In : re.findall(‘^Jame‘,"Jame,hello")
3
Out: [‘Jame‘]
元字符: $
匹配规则: 匹配目标字符串的结尾位置
xxxxxxxxxx
3
1
e.g.
2
In : re.findall(‘Jame$‘,"Hi,Jame")
3
Out: [‘Jame‘]
规则技巧:
^
和$
必然出现在正则表达式的开头和结尾处。如果两者同时出现,则中间的部分必须匹配整个目标字符串的全部内容。
元字符: *
匹配规则:匹配前面的字符出现0次或多次
xxxxxxxxxx
3
1
e.g.
2
In : re.findall(‘wo*‘,"wooooo~~w!")
3
Out: [‘wooooo‘, ‘w‘]
元字符:+
匹配规则: 匹配前面的字符出现1次或多次
xxxxxxxxxx
3
1
e.g.
2
In : re.findall(‘[A-Z][a-z]+‘,"Hello World")
3
Out: [‘Hello‘, ‘World‘]
元字符:?
匹配规则: 匹配前面的字符出现0次或1次
xxxxxxxxxx
3
1
e.g. 匹配整数
2
In [28]: re.findall(‘-?[0-9]+‘,"Jame,age:18, -26")
3
Out[28]: [‘18‘, ‘-26‘]
元字符:{n}
匹配规则: 匹配前面的字符出现n次
xxxxxxxxxx
4
1
e.g. 匹配手机号码
2
In : re.findall(‘1[0-9]{10}‘,"Jame:13886495728")
3
Out: [‘13886495728‘]
4
?
元字符:{m,n}
匹配规则: 匹配前面的字符出现m-n次
xxxxxxxxxx
3
1
e.g. 匹配qq号
2
In : re.findall(‘[1-9][0-9]{5,10}‘,"Baron:1259296994")
3
Out: [‘1259296994‘]
元字符: \d
\D
匹配规则:\d
匹配任意数字字符,\D
匹配任意非数字字符
xxxxxxxxxx
3
1
e.g. 匹配端口
2
In : re.findall(‘\d{1,5}‘,"Mysql: 3306, http:80")
3
Out: [‘3306‘, ‘80‘]
元字符: \w
\W
匹配规则: \w
匹配普通字符,\W
匹配非普通字符
说明: 普通字符指数字,字母,下划线,汉字。
xxxxxxxxxx
3
1
e.g.
2
In : re.findall(‘\w+‘,"server_port = 8888")
3
Out: [‘server_port‘, ‘8888‘]
元字符: \s
\S
匹配规则:\s
匹配空字符,\S
匹配非空字符
说明:空字符指 空格\r \n \t \v \f
字符
xxxxxxxxxx
3
1
e.g.
2
In : re.findall(‘\w+\s+\w+‘,"hello world")
3
Out: [‘hello world‘]
元字符:\b
\B
匹配规则:\b
表示单词边界,\B
表示非单词边界
说明:单词边界指数字字母(汉字)下划线与其他字符的交界位置。
xxxxxxxxxx
3
1
e.g.
2
In : re.findall(r‘\bis\b‘,"This is a test.")
3
Out: [‘is‘]
注意: 当元字符符号与Python字符串中转义字符冲突的情况则需要使用r将正则表达式字符串声明为原始字符串,如果不确定那些是Python字符串的转义字符,则可以在所有正则表达式前加r。
类别 | 元字符 |
---|---|
匹配字符 | . [...] [^...] \d \D \w \W \s \S |
匹配重复 | * + ? {n} {m,n} |
匹配位置 | ^ $ \b \B |
其他 | | () \ |
目的 : 如果匹配的目标字符串中包含正则表达式特殊字符,则在表达式中元字符就想表示其本身含义时就需要进行 \ 处理。
xxxxxxxxxx
1
1
特殊字符: . * + ? ^ $ [] () {} | \
操作方法:在正则表达式元字符前加 \ 则元字符就是去其特殊含义,就表示字符本身
xxxxxxxxxx
3
1
e.g. 匹配特殊字符 . 时使用 \. 表示本身含义
2
In : re.findall(‘-?\d+\.?\d*‘,"123,-123,1.23,-1.23")
3
Out: [‘123‘, ‘-123‘, ‘1.23‘, ‘-1.23‘]
贪婪模式: 默认情况下,匹配重复的元字符总是尽可能多的向后匹配内容。比如: * + ? {m,n}
非贪婪模式(懒惰模式): 让匹配重复的元字符尽可能少的向后匹配内容。
在对应的匹配重复的元字符后加 ‘?‘ 号即可
xxxxxxxxxx
4
1
* -> *?
2
+ -> +?
3
? -> ??
4
{m,n} -> {m,n}?
xxxxxxxxxx
3
1
e.g.
2
In : re.findall(r‘\(.+?\)‘,"(abcd)efgh(higk)")
3
Out: [‘(abcd)‘, ‘(higk)‘]
在正则表达式中,以()建立正则表达式的内部分组,子组是正则表达式的一部分,可以作为内部整体操作对象。
xxxxxxxxxx
7
1
e.g. 改变 +号 重复的对象
2
In : re.search(r‘(ab)+‘,"ababababab").group()
3
Out: ‘ababababab‘
4
?
5
e.g. 改变 |号 操作对象
6
In : re.search(r‘(王|李)\w{1,3}‘,"王者荣耀").group()
7
Out: ‘王者荣耀‘
捕获组本质也是一个子组,只不过拥有一个名称用以表达该子组的意义,这种有名称的子组即为捕获组。
格式:
(?P<name>pattern)
xxxxxxxxxx
4
1
e.g. 给子组命名为 "pig"
2
In : re.search(r‘(?P<pig>ab)+‘,"ababababab").group(‘pig‘)
3
Out: ‘ab‘
4
?
xxxxxxxxxx
6
1
re.findall(pattern,string,flags = 0)
2
功能: 根据正则表达式匹配目标字符串内容
3
参数: pattern 正则表达式
4
string 目标字符串
5
flags 功能标志位,扩展正则表达式的匹配
6
返回值: 匹配到的内容列表,如果正则表达式有子组则只能获取到子组对应的内容
xxxxxxxxxx
7
1
re.split(pattern,string,max,flags = 0)
2
功能: 使用正则表达式匹配内容,切割目标字符串
3
参数: pattern 正则表达式
4
string 目标字符串
5
max 最多切割几部分
6
flags 功能标志位,扩展正则表达式的匹配
7
返回值: 切割后的内容列表
xxxxxxxxxx
8
1
re.sub(pattern,replace,string,count,flags = 0)
2
功能: 使用一个字符串替换正则表达式匹配到的内容
3
参数: pattern 正则表达式
4
replace 替换的字符串
5
string 目标字符串
6
count 最多替换几处,默认替换全部
7
flags 功能标志位,扩展正则表达式的匹配
8
返回值: 替换后的字符串
xxxxxxxxxx
6
1
re.finditer(pattern,string,flags = 0)
2
功能: 根据正则表达式匹配目标字符串内容
3
参数: pattern 正则表达式
4
string 目标字符串
5
flags 功能标志位,扩展正则表达式的匹配
6
返回值: 匹配结果的迭代器
xxxxxxxxxx
5
1
re.match(pattern,string,flags=0)
2
功能:匹配某个目标字符串开始位置
3
参数:pattern 正则
4
string 目标字符串
5
返回值:匹配内容match object
xxxxxxxxxx
5
1
re.search(pattern,string,flags=0)
2
功能:匹配目标字符串第一个符合内容
3
参数:pattern 正则
4
string 目标字符串
5
返回值:匹配内容match object
span() 获取匹配内容的起止位置
groupdict() 获取捕获组字典,组名为键,对应内容为值
group(n = 0)
功能:获取match对象匹配内容 参数:默认为0表示获取整个match对象内容,如果是序列号或者组名则表示获取对应子组内容 返回值:匹配字符串
作用函数:re模块调用的匹配函数。如:re.findall,re.search....
功能:扩展丰富正则表达式的匹配功能
常用flag
xxxxxxxxxx
7
1
A == ASCII 元字符只能匹配ascii码
2
?
3
I == IGNORECASE 匹配忽略字母大小写
4
?
5
S == DOTALL 使 . 可以匹配换行
6
?
7
M == MULTILINE 使 ^ $可以匹配每一行的开头结尾位置
注意:同时使用多个flag,可以用竖线连接 flags = re.I | re.A
人工管理阶段
缺点 : 数据存储量有限,共享处理麻烦,操作容易混乱
文件管理阶段 (.txt .doc .xls)
优点 : 数据可以长期保存,可以存储大量的数据,使用简单。
缺点 : 数据一致性差,数据查找修改不方便,数据冗余度可能比较大。
数据库管理阶段
优点 : 数据组织结构化降低了冗余度,提高了增删改查的效率,容易扩展,方便程序调用处理
缺点 : 需要使用sql 或者其他特定的语句,相对比较专业
数据库应用领域
数据库的应用领域几乎涉及到了需要数据管理的方方面面,融机构、游戏网站、购物网站、论坛网站 ... ...都需要数据库进行数据存储管理。
数据库分类和常见数据库
关系型: 采用关系模型(二维表)来组织数据结构的数据库
非关系型: 不采用关系模型组织数据结构的数据库
开源:MySQL、SQLite、MongoDB
非开源:Oracle、DB2、SQL_Server
1996年,MySQL 1.0发布,作者Monty Widenius, 为一个叫TcX的公司打工,当时只是内部发布。到了96年10月,MySQL 3.11.1发布了,一个月后,Linux版本出现了。真正的MySQL关系型数据库于1998年1月发行第一个版本。MySQL是个开源数据库,后来瑞典有了专门的MySQL开发公司,将该数据库发展壮大,在之后被Sun收购,Sun又被Oracle收购。
官网地址:https://www.mysql.com/
MySQL特点
MySQL安装
Ubuntu安装MySQL服务
Windows安装MySQL
启动和连接MySQL服务
服务端启动
连接数据库
xxxxxxxxxx
1
1
mysql -h 主机地址 -u 用户名 -p
注意:
- 回车后深入数据库密码 (我们设置的是123456)
- 如果链接自己主机数据库可省略 -h 选项
关闭连接
xxxxxxxxxx
2
1
ctrl-D
2
exit
数据元素 --> 记录 -->数据表 --> 数据库
<