今日内容概要
-
作业讲解
-
字符编码
-
文件处理
python代码操作文件读写
今日内容详细
作业讲解
1.字典练习题
1.将列表中大于等于66的元素放入字典k1键对应的列表中
将列表中小于66的元素放入字典k2键对应的列表中
nums = [11,22,33,44,55,66,77,88,99,90]
dic = {
'k1':[],
'k2':[]
}
#循环列表中的每一个元素
for i in nums:
#判断i是否大于等于66
if i >= 66 :
# res = dic['k1'] # 取k1键对应的列表
# res.append(i) # 将i追加到列表中
dic['k1'].append(i)
else:
# res1 = dic['k2'] # 取k2键对应的列表
# res1.append(i) # 将i追加到列表中
dic['k2'].append(i)
print(dic) # {'k1': [66, 77, 88, 99, 90], 'k2': [11, 22, 33, 44, 55]}
2.
s='hello jason jason say hello sb sb sb'
#统计字符串中每个单词出现的次数{'jason':2,...}
res = {}
s = s.split()
for i in s:
res[i] = s.count(i)
print(res) # {'hello': 2, 'jason': 2, 'say': 1, 'sb': 3}
d1 = {}
res = s.split() # 按照空格切割字符串
for i in res:
if i not in d1:
d1[i] = 1 # 先初始化'hello'为1
else:
d1[i] += 1 # 在原有的基础上加一
print(d1) # {'hello': 2, 'jason': 2, 'say': 1, 'sb': 3}
2.集合练习题
一.关系运算
有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
linuxs={'wupeiqi','oldboy','gangdan'}
1. 求出即报名python又报名linux课程的学员名字集合
print(pythons & linuxs) # {'wupeiqi', 'gangdan'}
2. 求出所有报名的学生名字集合
print(pythons | linuxs) # {'gangdan', 'biubiu', 'oldboy', 'egon', 'alex', 'yuanhao', 'wupeiqi'}
3. 求出只报名python课程的学员名字
print(pythons - linuxs) # {'egon', 'biubiu', 'alex', 'yuanhao'}
4. 求出没有同时这两门课程的学员名字集合
print(pythons ^ linuxs) # {'biubiu', 'oldboy', 'egon', 'alex', 'yuanhao'}
二 去重并且保留原来的顺序
l = [11,22,33,22,22,33,11,22,55,66,66,77,77]
1.去重不保留顺序
# 将列表换成集合
res = set(l)
print(res) # {33, 66, 11, 77, 22, 55}
# 在将集合换成列表
res1 = list(res) # [33, 66, 11, 77, 22, 55]
print(res1)
2.去重并且保留顺序
# 先定义一个空列表
res = []
# 再循环取出每一个元素
for i in l:
# 判断当前元素是都在新的列表中 如果不在则添加
if i not in res:
res.append(i)
print(res) # [11, 22, 33, 55, 66, 77]
字符编码
什么是字符编码?
人类在与计算机交互时,用的都是人类能读懂的字符,如中文字符、英文字符、日文字符等
而计算机只能识别二进制数,详解如下:
二进制数即由0和1组成的数字,例如010010101010。计算机是基于电工作的,电的特性即高低电平,人类从逻辑层面将高电平对应为数字1,低电平对应为数字0,这直接决定了计算机可以识别的是由0和1组成的数字。
毫无疑问,由人类的字符到计算机中的数字,必须经历一个过程——字符——》翻译——》数字
翻译的过程必须参照一个特定的标准,该标准称之为字符编码表,该表上存放的就是字符与数字一一对应的关系。
字符编码中的编码指的是翻译或者转换的意思,即将人能理解的字符翻译成计算机能识别的数字。
单位换算(重要)
比特位bit(二进制数的个数)
8bit = 1bytes(字节)
1024bytes = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
1024TB = 1PB
字符编码的研究仅限于文本文件(******)
字符编码发展史
一家独大
现代计算机起源于美国,所以最先考虑仅仅是让计算机识别英文字符,于是诞生了ASCII表
# ASCII表的特点:
1、只有英文字符与数字的一一对应关系
2、一个英文字符对应1Bytes,1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
群雄割据
中国
为了让计算机能够识别中文和英文,中国人定制了GBK
# GBK表的特点:
1、只有中文字符、英文字符与数字的一一对应关系
2、一个英文字符对应1Bytes
一个中文字符对应2Bytes
补充说明:
1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
2Bytes=16bit,16bit最多包含65536个数字,可以对应65536个字符,足够表示所有中文字符
日本
为了让计算机能够识别日文和英文,日本人定制了Shift_JIS
# Shift_JIS表的特点:
1、只有日文字符、英文字符与数字的一一对应关系
韩国
为了让计算机能够识别韩文和英文,韩国人定制了 Euc-kr
# Euc-kr表的特点:
1、只有韩文字符、英文字符与数字的一一对应关系
文本编辑存取文件的原理:
文本文件内容全都为字符,无论存取都是涉及到字符编码问题
#1、存文本文件
人类通过文本编辑器输入的字符会被转化成ASCII格式的二进制存放于内存中,如果需要永久保存,则直接将内存中的ASCII格式的二进制写入硬盘
#2、读文本文件
直接将硬盘中的ASCII格式的二进制读入内存,然后通过ASCII表反解成英文字符
分久必合
unicode于1990年开始研发,1994年正式公布,具备两大特点:
#1. 存在所有语言中的所有字符与数字的一一对应关系,即兼容万国字符
#2. 与传统的字符编码的二进制数都有对应关系
文本编辑器输入任何字符都是最新存在于内存中,是unicode编码的,存放于硬盘中,则可以转换成任意其他编码,只要该编码可以支持相应的字符
# 英文字符可以被ASCII识别
英文字符--->unciode格式的数字--->ASCII格式的数字
# 中文字符、英文字符可以被GBK识别
中文字符、英文字符--->unicode格式的数字--->gbk格式的数字
# 日文字符、英文字符可以被shift-JIS识别
日文字符、英文字符--->unicode格式的数字--->shift-JIS格式的数字
utf-8的由来
unicode transformation format
将内存中的unicode二进制写入硬盘或者基于网络传输时必须将其转换成一种精简的格式,这种格式即utf-8(全称Unicode Transformation Format,即unicode的转换格式)
# 多国字符—√—》内存(unicode格式的二进制)——√—》硬盘(utf-8格式的二进制)
utf-8是针对Unicode的可变长度字符编码:一个英文字符占1Bytes,一个中文字符占3Bytes,生僻字用更多的Bytes存储。
unicode更像是一个过渡版本,我们新开发的软件或文件存入硬盘都采用utf-8格式,等过去几十年,所有老编码的文件都淘汰掉之后,会出现一个令人开心的场景,即硬盘里放的都是utf-8格式,此时unicode便可以退出历史舞台,内存里也改用utf-8,天下重新归于统一。
字符编码实操
1.解决文件乱码的核心
#1. 保证存的时候不乱:在由内存写入硬盘时,必须将编码格式设置为支持所输入字符的编码格式
#2. 保证存的时候不乱:在由硬盘读入内存时,必须采用与写入硬盘时相同的编码格式
2.编码与解码(重要)
编码
将人类的字符按照指定的编码转换成计算机能够识别的数据
encode()
解码
将计算机能否识别的数据按照指定的编码转换成人类能够读懂的字符
decode()
res = '好好学习 不负众望'
# 编码
ret = res.encode('gbk')
print(ret,type(ret))
# bytes类型 在python中直接看成是二进制数据即可
# 解码
ret1 = ret.decode('gbk')
print(ret1) # 好好学习 不负众望
3.python解释器默认编码
python2默认的是ASCII码
在python2中定义字符串在前面加一个字母u
文件头指定编码
# -*- conding:utf8 -*-
name = u'jason'
python3默认的是utf8码
文件处理
操作系统
windows mac linux
双击文件
硬盘转 磁头读取数据
保存文件
硬盘转 磁头写入数据
我们在操作文件的时候其实操作的是硬盘
'''文件其实是操作系统暴露给我们可以简单快捷的操作硬盘的接口'''
绝对路径与相对路径
绝对路径
非常详细的路径描述
无论什么人什么位置都可以找到
相对路径
有一个参考
只有对应的人才可以找到
文件操作基本流程
# 1. 打开文件,由应用程序向操作系统发起系统调用open(...),操作系统打开该文件,对应一块硬盘空间,并返回一个文件对象赋值给一个变量f
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r
# 2. 调用文件对象下的读/写方法,会被操作系统转换为读/写硬盘的操作
data=f.read()
# 3. 向操作系统发起关闭文件的请求,回收系统资源
f.close()
res = open(r'a.txt','r',encoding='utf8')
print(res.read())
res.close()
with上下文管理
# 打开a.txt 使用变量名f指代改文件
with open(r'a.txt','r',encoding='utf8') as f:
print(f.read()) # 读取文件内容
# with子代码运行结束之后会自动调用close关闭文件资源
"""
with open(文件路径,读写模式,编码格式) as 变量名:
子代码块
文件路径是必须的
读写模式和编码格式是可选的
"""
# 如果不指定读写模式 那么默认使用r
# 如果不指定编码格式 那么默认使用当前计算机内部默认编码
"""在中国所有的windows电脑内部默认的编码是gbk"""
with open(r'a.txt') as f:
print(f.read()) # 读取文件内容
# 取消转义
res = r'D:\day08\a.txt'
res1 = r'D:\day08\n.txt'
res2 = r'D:\day08\t.txt'
print(res,res1,res2)
浙公网安备 33010602011771号