软件启动的流程 打开notepad++ 来查看test.txt文档 1.从硬盘将软件程序加载到内存中 2.加载test.txt到内存中 3.执行notepad的代码将test.txt的内容输出到屏幕上 python解释器也是一个应用软件 1.从硬盘将解释器加载到内存中 2.加载test.py到内存中 3.解释器解析python语法 文本编辑器与解释器在打开同一个py文件时 前两个阶段是一致的,仅仅是第三个阶段不同 什么是字符编码?字符编码表 编码,按照某种规范 将数据转换为二进制 为什么要编码? 计算机只能识别0/1,那么要使用计算机则必须将所有的数据和命令都用二进制表示 这是一个复杂的过程,所以需要一种解决方案,可以让计算机识别人类的语言 字符编码的发展史 美国人发明了计算机,需要让计算机识别美国人的语言,所以诞生了asc编码表 其他的国家也需要使用计算机,于是每个国建都退出了自己的编码表 中国-GBK 日本-shift-j 因为每个编码表互不兼容,导致乱码问题 为了统一全世界的编码 推出而unicode编码 1.统一全世界的编码 2.必须还兼容之前的GBK,shift-j ASCII 中用八个二进制(1个bytes) GBK 英文字母占一个字节 中文占两个字节 16个二进制 2**16-1=65535 如果一个字节的首位为1 表示一个中文 若果一个字节的首位为0 表示一个英文 GBK不仅仅要存储数据 还要计算每一个符号占的长度 unicode 无论英文还是其他字符 都是2个字节 为什么这么设计?不浪费空间? 1.为了提高效率,而采取的空间换时间(效率) unicode的问题 浪费空间,降低网络传输效率 为了解决上述unicode的问题、:退出了UTF-8 utf-8是变长的 英文占一个字节 中文占三个字节 生僻字占更多字节 与GBK相同的是,都需要计算,所以不适用于内存 适用于:硬盘和网络传输 结论就是 内存中用unicode,硬盘或网络中用UTF-8 用户输入->内存(unicode)->转换成(utf-8)->硬盘 该过程称之为编码 就是字符转为二进制的过程 硬盘上的a.txt(utf-8的二进制)-> 内存中unicode的二进制—>查编码表得到符号->显示到屏幕上 该过程称之为解码 把二进制转为符号 乱码问题? 1.存储时与取出时使用的编码方式不一致 乱码不仅仅是因为存和取的编码不同,还可能是存的时候就已经乱了,这将导致数据流失! 所以存的时候一定要注意: 所使用的编码方式一定要支持文档中的所有内容,即utf-8 python在执行代码之前必须从硬盘加载代码到内存,而硬盘中都是二进制数据,必须先解码为unicode 那解释器怎么知道拟采用的什么编码方式? 如果不明确自定 解释器将采用默认的解码方式,在python3中默认为utf-8而python2中默认为ASC 当你使用的是py2的时候 则需要手动制定编码方式,在文档的第一行写上 coding:uft-8 coding:uft-8 py2中当从内存访问变量时可能会乱码,例如存储时utf-8的字符但是输出时 却用了GBK python2中u 表示 将这个变量存储为unicode编码 可以防止取出变量时乱码 数据类型也变为了unicode 1个16进制 = 0.5个字节 encode: unicode->uft-8 将unicode的字符 转为自定的二进制 decode: utf-8 ->unicode 将二进制转为unicode 文件处理: 文件是什么? 文件是操作系统提供的一套虚拟概念 文件这个概念之所以出现 是为了简化对硬盘的操作 学习文件处理是为了将数据永久保存 打开文件的语法1 1.打开文件 f=open('test.txt',encoding='utf-8')#是给系统发送了一个指令,让操作系统去打开文件,因为应用程序无法直接控制硬件 2.读取内容 data=f.read() print(data) 3.关闭文件 不要忘记关闭 f.close() open close read等都是在给操作系统发送指令 打开文件的语法2: 在with代码执行完毕后会自动调用close with open ('test.txt',encoding='utf-8') as f: data= f.read() print(data) 参数1 文件路径 可以是相对 也可以是绝对 mode 打开文件的模式 r(只读) w(只写) +(可读可写)了解即可 + 表示可读可写 w+ 清空源文件如果不存在则创建 r+ 如果不存在则报错 a+ 如果不存在则创建,光标移动到最后 可读可写 可用于文本处理 但是对于写别的文件,一般不用,很容易造成文件损坏 encoding 编码方式 windows默认为GBK Linux默认为utf-8 读取内容 可以用参数指定要读取的个数,默认为-1 表示全部读取 需要注意 read(-1)仅限于文件较小时,如果文件太大会造成内存溢出 data=f.read(2000) f.readable() 判断是否可读 f.writable()判断是否可写 line=f.readline() 使用循环 来读取全部内容1 with open(r'D:\ \ \ ,encoding='utf-8') as f: while True: line = f.readline() if not line:#如果line为空则表示没有内容了 break print(line,end='') 使用循环 来读取全部内容2 with open(r'D:\ \ \ ,encoding='utf-8') as f: for line in f: print(line,end='') 使用循环 来读取全部内容3 #一次性读取全部 with open(r'D:\ \ \ ,encoding='utf-8') as f: print(f.readlines())#会将每行放入列表中 读取相关函数 read() 读取全部 read(size) 读取指定大小 readlines 读取全部 readlin 读取一行 readable 是否可读 注意在W模式写 一旦打开文件 立即清空原来的内容 如果文件不存在则创建新文件 写入字符串时需要手动拼接换行符 with open(r'D:\ \ \ ,mode='w',encoding='utf-8') as f: f.write('矮跟') f.writelines('\n'.join(....)) 在操作非文本文件时,必须明确指定为字节模式 b 用来指定为字节模式 注意: b 必须与r\w连用 rb(readBytes)\wb(writeBytes) 当文件为字节模式时 不能指定encoding参数! 默认情况下时读写文本模式 也就是t模式同样需要与r\w连用 rt(readText)\wt(writeText) t模式下 python解释器会自动进行编码和解码而b模式不会 当模式为字节模式时(rb)单位为字节 #循环读取全部内容 with open('xxx.png',mode='rb') as f: while True: data = f.read(1024) if not data:#如果data为空则意味着文件读完了 break print(data) 在b模式只能写入字节 追加写入: a 表示追加写入 不会清空原数据 会把光标移动到最后 控制文件的打开模式 r\w\a 控制操作文件内容的模式 t\b t\b 必须与打开模式连用 各种组合如下: rt wt at rb wb ab r+ w+ a+ 关于文件操作的常用函数 read readline readlines readable write writelines writeable 关于编码的两个函数 encode 编码 decode 解码
字符编码,文件处理
最新推荐文章于 2021-10-04 16:03:20 发布