python,day06笔记
今日内容概要
-
字符编码的概念
-
文件处理
用python代码来操作文件的创建、书写、修改
-
函数
-
模块
-
面向对象
python本质就是一门面向对象的编程语言
今日内容详细
知识补充
布尔值为False的情况有哪些
0 、None 、 '' 、[ ] 、 { }
字符编码
'''有时候当我们打开一个文件的时候发现展示的内容是一段乱码,这种情况是如何产生的,以及如何解决
字符编码的研究只针对文本文件,视频音频文件没有字符一说,不在研究范围之内
知识回顾
1、软件运行前,软件的代码及其相关数据都是存放于硬盘中的
2、任何软件的启动都是将数据从硬盘中读入内存,然后cpu从内存中取出指令并执行
3、软件运行过程中产生的数据最先都是存放于内存中的,若想永久保存软件产生的数据,则需要将数据由内存写入硬盘
普通的文本编辑器
阶段1、启动一个文件编辑器(文本编辑器如nodepad++,pycharm,word)
阶段2、文件编辑器会将文件内容从硬盘读入内存
阶段3、文本编辑器会将刚刚读入内存中的内容显示到屏幕上
python解释器
阶段1、启动python解释器,此时就相当于启动了一个文本编辑器
阶段2、python解释器相当于文本编辑器,从硬盘上将test.py的内容读入到内存中
阶段3、python解释器解释执行刚刚读入的内存的内容,开始识别python语法
文本编辑器和python解释器的异同点
1、相同点:前两个阶段二者完全一致,都是将硬盘中文件的内容读入内存,详解如下
python解释器是解释执行文件内容的,因而python解释器具备读py文件的功能,这一点与文本编辑器一样
2、不同点:在阶段3时,针对内存中读入的内容处理方式不同,详解如下
文本编辑器将文件内容读入内存后,是为了显示或者编辑,根本不去理会python的语法,而python解释器将文件内容读入内存后,可不是为了给你瞅一眼python代码写的啥,而是为了执行python代码、会识别python语法)
计算机由于是基于电工作的,只能识别识别010101二进制数据,但是我们人在使用计算机的时候却可以使用各式各样的文字语言
人类的字符 转换过程 二进制数字'''
字符编码发展史
'''计算机起源于美国
美国人用的是英文,而计算机只认识二进制,美国人需要解决英文字符和二进制之间的转换关系(ASCII码)
"""
8bit = 1bytes
1024bytes = 1KB
1024KB = 1MB
1024MB = 1GB
"""
一家独大
ASCII码
记录了英文字符和数字之间的转换关系
用8位来来表示一个英文字符
2**8(其实2的7次方足以表示所有的英文字符,但是考虑到后续可能会出现新的语言,所以留了一位备用)
群雄割据
自己得开发一套自己的字符编码表
中国人
GBK编码表
记录了中文字符、英文字符跟数字的对应关系
用16位来表示一个中文字符,针对英文字符还是用8位
(针对生僻字我们可能会使用更高位数来表示)
韩国人
Euc_kr编码表
记录了韩文、英文跟数字的对应关系
日本人
shift_JIS编码表
记录了日文、英文跟数字的对应关系
# 每个国家自己使用自己的编码,无法实现国家之间数据的交互
"""在中国电脑上使用GBK编写的文件基于网络发送给日本人
打开的时候使用的是shift_JIS编码表,会造成文件乱码现象
"""
天下一统
为了解决群雄割据的局面,实现数据的统一思想
unicode编码表 万国码
兼容所有国家的所有编码
统一使用16位即2bytes表示数据(针对生僻字会采用更多的位数)
我们现在之所以能够在一台计算机上敲出各个国家的文字就是因为我们计算机内存中使用的是unicode编码表
unicode的弊端,针对纯英文的文件存储空间会翻倍,随之而来的等待时间也会翻倍这个是我们无法容忍的
utf8 万国码的转换格式
它是存在与硬盘中的
(内存使用unicode硬盘使用utf8)
针对中文使用3bytes英文使用1bytes
当我们书写文件的时候编码默认使用utf8即可,目前绝大多数的软件使用的都是utf8'''
字符编码和要掌握的内容
变量名.encode('utf-8') >>>>>> 使用utf8格式编码
变量名.decode('utf-8') >>>>>> 使用utf-8 格式解码
"""1.解决乱码的核心就是在于用什么编码编的就用什么码来解
2.代码层面如何用数据进行编码与解码
基于网络传输数据,数据必须是bytes格式(二进制格式)
eg: info = '这是一段字符串'
把字符串按照指定的编码编成bytes格式
res = info.encoude('utf-8')
print(res) >>>>>>>>此时res所待变的则就是经过utf8转码后的二进制码
在python中如果字符串有一个b,则说明该数据类型为bytes类型
python中的bytes类型你可以直接看成是二进制数据
将bytes类型的数据按照指定的编码解析成人类可读的数据
res1 = res.decode('utf_8')
print(res1)
3.python2版本和python3版本默认的字符编码是不一致的
python2版本出来的时候还没有unicode,python2内部采用的是ASCII
python3版本默认的则为utf8
针对python2我们在书写字符串的时候会采用
1.文件头的形式
coding:utf8
2.在所有的字符串前面加上字母u
info = u'这是一段字符串'"""
文件处理
"""
什么是文件?
文件就是用来帮助我们保存数据的
文件的本质其实就是操作系统给我们封装的一个用来操作计算机硬盘的快捷工具
文件的操作
(了解)
file = open(r'a.txt','r',encoding='utf-8') >>>>>> 此处的r作用为防止路径中的\与字母 >>>打开文件 被解释为特殊含义,从而出现代码错误。
file.close() >>>>关闭文件
with 上下文管理
with open(r'a.txt','r',encoding='utf-8') as f:
>>>>>这里的f就是一个变量名用来指代open的结果
res = f.read()
print(res)
固定句式
with open(r'文件路径'(必需),'读写模式'(必需),encoding(不是必需的)) as 变量名:
缩进的代码用于操作文件
"""
文件的打开方式
r 只读模式
w 只写模式
a 只追加写模式
"""
r 模式打开文件的时候若输入的文件名不存在则直接报错
witn open(r'b.txt', 'r', encoding='utf8') as f:
pass >>>>>>此处pass的本身没有任何意义,用来补全代码结构
文件名存在:r模式会以只读的形式打开文件
with open(r'a.txt', 'r', encoding= 'utf8') as = f:
data = f.read() >>>>>读取文件内的所有数据
print(data)
w 模式
若输入的文件名不存在, w 模式会自动帮你创建新文件并重命名
with open(r 'b.txt', 'w', encoding= 'utf8') as = f:
pass >>>>>补全代码
文件名存在:w模式会以只写的形式打开文件(先清空文件再写入容)
with open(r'a.txt', 'w', encoding='utf8') as f:
f.write('哈哈哈哈\n')
f.write('哈哈哈哈\n')
f.write('哈哈哈哈')
a模式
文件名不存在,a模式会帮你创建文件
with open(r 'c.txt', 'a', encoding='utf8') as = f:
pass
文件名存在,a模式会以只追加写的形式打开文件(不会清空原文件的内容)
with open(r'a.txt', 'a', encoding='utf8') as f:
f.write('嘿嘿嘿')"""
文件操作的常用方法
'''
read() >>>>>>读取文件操作
1.执行完read方法之后光标会停留在文件末尾,再次读取时就没有内容了
2.当文件特别大的时候,执行read可能会造成内存溢出(撑爆了)
推荐
for循环文件对象
write() >>>>>>>写入文件内容
readable() >>>>>>判断文件是否可读
f.writable() >>>>>判断文件是否可写
f.readline() >>>>>>只读一行数据
f.readlines() >>>>>将文件内容全部读取出来并且组织成列表的形式
f.writelines([]) >>>>>一次性将列表多个元素全部写入文件
f.flush() >>>>>>>将内存中的数据立刻刷到硬盘上
'''
文件的操作模式
'''
t 文本模式
该模式也是默认的模式
r rt
w wt
a at
1.该模式只能用于文本文件
2,该模式读写都市以字符串为单位
3.该模式必须要有encoding参数
b 二进制(bytes)模式
1.该模式可以用于任意的文件
2.该模式读写都是以butes为单位
3.该模式不一定要有encoding参数
'''
控制光标的移动
"""
f.seek(offset,whence)
offset:移动量
whence:模式
0:可以在t和b使用(相对于文件开头)
1:只能在b模式使用(相对于光标所在的位置)
2:只能在b模式使用(相对于文件末尾)
"""
文件的修改
"""
eg: 文件 b.txt 内容为 my name is egon ,my age is 18.
将文件中的egon修敢为jason
with open(r 'b.txt','r',encoding='utf8') as = f:
>>>>>>以只读模式打开文件b.txt并赋值在变量f上
data = f.read() >>>>>读取文件的内容并赋值给变量data
with open(r 'b.txt','w',encoding = 'utf8') as = f:
>>>>>>>>以只写模式打开b.txt文件并赋值在变量f上
res = data.replace('egon','jason') >>>>>>字符串的替换(替换数据)
f.write(res) >>>>>>>写入数据
方式二:
先创建一个新文件,将老文件内容写入新文件
将老文件删除并重命名新文件名为老文件名
import os
with open(r'b.txt', 'r', encoding='utf-8') as read_f, \
open(r'b_backend.txt', 'w', encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line.replace('jason', 'jasonDSB'))
os.remove ('b.txt') >>>>将原文件删除
os.rename('b_backend.txt , 'b.txt) >>>>>重命名
"""
作业
'''1.基于做题作业的第二道题扩展新功能(思考)
当用户输错三次之后,提示用户是否继续尝试
(y/n),用户如果想继续尝试则再给用户三次机会
不想尝试则退出程序'''
'''2.参考代码完善功能(拔高题)
# 拷贝数据
with open(r'111.jpg','rb') as rf,open(r'222.jpg','wb') as wf:
# 读取111.jpg数据写入222.jpg
for line in rf:
wf.write(line)
1.针对拷贝出来的文件存放位置,用户可以自定义
2.针对被拷贝文件也让用户自定义选择(思考即可)'''
浙公网安备 33010602011771号