python-day10(正式学习)
程序员文章站
2023-11-28 14:01:28
[TOC] 字符编码 计算机基础 应用程序任何操作硬件的请求都需要向操作系统发起系统调用,然后由操作系统去操作硬件 文本编辑器存取文件的原理 1. 打开编辑器就打开启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放在内存中的,断电后数据丢失 2. 想要永久保存,需要点击保存按钮:编辑器 ......
目录
字符编码
计算机基础
应用程序任何操作硬件的请求都需要向操作系统发起系统调用,然后由操作系统去操作硬件
文本编辑器存取文件的原理
- 打开编辑器就打开启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放在内存中的,断电后数据丢失
- 想要永久保存,需要点击保存按钮:编辑器吧内存的数据刷到了硬盘上
- 在我们编写一个py文件(没有执行),跟编写其他文件没什么区别,都只是在编写一堆字符而已
python解释器执行py文件的原理
- 第一阶段:python解释器启动,此时就相当于启动了一个文本编辑器
- 第二阶段:python解释器相当于文本编辑器,去打开test.py文件,从硬盘上将test.py的文件内容读入到内存中(小复习:pyhon的解释性,决定了解释器只关心文件内容,不关心文件后缀名)。
- 第三阶段:python解释器解释执行刚刚加载到内存中test.py的代码( ps:在该阶段,即真正执行代码时,才会识别python的语法,执行文件内代码,当执行到name="egon"时,会开辟内存空间存放字符串"egon")。
python解释器与文本编辑的异同
- 相同点:python解释器是解释执行文件内容的,因而python解释器具备读py文件的功能,这一点与文本编辑器一样。
- 不同点:文本编辑器将文件内容读入内存后,是为了显示或者编辑,根本不去理会python的语法,而python解释器将文件内容读入内存后,可不是为了给你瞅一眼python代码写的啥,而是为了执行python代码、会识别python语法。
字符编码介绍
计算机想要读懂人类的字符就要通过字符编码,因为计算机只认识0和1。字符编码的的编码过程就是字符->翻译过程->数字
字符编码的分类
utf-8(未来趋势)
gbk(中国)
unicode(万能识别)
shift_jis(日本)
euc-kr(韩国)
ascii(美国)
乱码分析
首先明确概念
- 文件从内存刷到硬盘的操作简称存文件
- 文件从硬盘读到内存的操作简称读文件
乱码的两种情况:
- 乱码一:存文件时就已经乱码
存文件时,由于文件内有各个国家的文字,我们单以shiftjis去存,
本质上其他国家的文字由于在shiftjis中没有找到对应关系而导致存储失败。但当我们硬要存的时候,编辑并不会报错(难道你的编码错误,编辑器这个软件就跟着崩溃了吗???),但毫无疑问,不能存而硬存,肯定是乱存了,即存文件阶段就已经发生乱码,而当我们用shiftjis打开文件时,日文可以正常显示,而中文则乱码了。
- 乱码二:存文件时不乱码而读文件时乱码
存文件时用utf-8编码,保证兼容万国,不会乱码,而读文件时选择了错误的解码方式,比如gbk,则在读阶段发生乱码,读阶段发生乱码是可以解决的,选对正确的解码方式就ok了。
总结
- 保证不乱码的核心法则就是,字符按照什么标准而编码的,就要按照什么标准解码,此处的标准指的就是字符编码。
- 在内存中写的所有字符,一视同仁,都是unicode编码,比如我们打开编辑器,输入一个“你”,我们并不能说“你”就是一个汉字,此时它仅仅只是一个符号,该符号可能很多国家都在使用,根据我们使用的输入法不同这个字的样式可能也不太一样。只有在我们往硬盘保存或者基于网络传输时,才能确定”你“到底是一个汉字,还是一个日本字,这就是unicode转换成其他编码格式的过程了。简而言之,就是内存中固定使用的就是uncidoe编码,我们唯一能改变的就是存储到硬盘时使用的编码。
文件操作
三种基本操作
文件打开之r模式,只能读不能写
# rt: read by text # windows的操作系统默认编码为gbk,因此需要使用utf8编码 f = open('32.txt', mode='rt', encoding='utf8') data = f.read() print(data) print(f"type(data): {type(data)}") f.close() #文件读完后指针会跑到文件末端,再次读取的将会是空格
aaa bbb ccc nick最帅吗 type(data): <class 'str'>
readline()和readlines()
# f.readline()/f.readlines() f = open('32.txt', mode='rt', encoding='utf8') print(f"f.readable(): {f.readable()}") # 判断文件是否可读 data1 = f.readline() data2 = f.readlines() print(f"data1: {data1}") print(f"data2: {data2}") f.close()
f.readable(): true data1: aaa data2: ['bbb\n', 'ccc\n', 'nick最帅吗']
文件打开之w模式,只能写不能读
# wt f = open('34w.txt', mode='wt', encoding='utf8') print(f"f.readable(): {f.readable()}") f.write('nick 真帅呀\n') # '\n'是换行符 f.write('nick,nick, you drop, i drop.') f.write('nick 帅的我五体投地') f.flush() # 立刻将文件内容从内存刷到硬盘,该模式会先清空文件内的所有内容再写入 f.close()
f.readable(): false
文件打开之a模式,只能追加
# at f = open('34a.txt', mode='at', encoding='utf8') print(f"f.readable(): {f.readable()}") f.write('nick 真帅呀\n') # '\n'是换行符 f.write('nick,nick, you drop, i drop.') f.write('nick 帅的我五体投地') f.close()
f.readable(): false
文件打开二进制,b模式一般用于存取音频和图片
try: import requests response = requests.get( 'http://www.chenyoude.com/python从入门到放弃/文件的三种打开模式-mv.jpg?x-oss-process=style/watermark') data = response.content f = open('mv.jpg?x-oss-process=style/watermark', 'wb') f.write(data) print('done...') f.close() except exception as e: print(e, '报错了,那就算了吧,以后爬虫处会详细介绍')
done...
f = open('34w.txt', 'wb') f.write('nick 好帅啊'.encode('utf8')) f.close()
with管理文件操作上下文
之前我们使用open()方法操作文件,但是open打开文件后我们还需要手动释放文件对操作系统的占用。但是其实我们可以更方便的打开文件,即python提供的上下文管理工具——with open()。
with open('32.txt', 'rt', encoding='utf8') as f: print(f.read())
sdf
with open()方法不仅提供自动释放操作系统占用的方法,并且with open可以使用逗号分隔,一次性打开多个文件,实现文件的快速拷贝。
with open('32.txt', 'rb') as fr, \ open('35r.txt', 'wb') as fw: f.write(f.read())