字符编码和文件处理

计算机运行的三大核心硬件

1.CPU      2.内存      3.硬盘

任何一个程序要想运行必须先由硬盘加载到内存,然后去CPU取值执行。

运行着的应用程序产生的数据,必须先存到内存。

字符编码

字符编码针对的是文字

文本编辑器的输入和输出是两个过程,人在操作计算机的时候输入的是人能够看懂的字符,但是计算机只能识别010101这样的二进制数据,那么输入的字符 >>>(字符编码表)>>> 二进制数字

字符编码表就是字符与数字的对应关系
a 0
b 1
a 00
b 01
c 11
d 10

阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII

ASCII:用八位二进制表示一个英文字符   所有的英文字符+符号最多也就在125位左右

ASCII最初只用了后七位,127个数字,已经完全能够代表键盘上所有的字符了(英文字符/键盘的所有其他字符)

后来为了将拉丁文也编码进了ASCII表,将最高位也占用了

阶段二:为了满足中文,中国人定制了GBK

GBK:用2Bytes表示一个中文字符 还是用1Bytes表示一个英文字符

为了满足其他国家,各个国家纷纷定制了自己的编码

日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr

阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。

于是产生了unicode, 统一用2Bytes代表一个字符, 2**16-1=65535,可代表6万多个字符,因而兼容万国语言

但对于通篇都是英文的文本来说,这种编码方式无疑是多了一倍的存储空间(二进制最终都是以电或者磁的方式存储到存储介质中的)

于是产生了UTF-8,对英文字符只用1Bytes表示,对中文字符用3Bytes

1.浪费存储空间

2.io次数增减,程序运行效率降低(致命)

当内存中的unicode编码格式数据存到硬盘的时候,会按照utf-8编码
unicode transformation format

会将unicode的英文字符由原来的2Bytes变成1Bytes
会将unicode中文字符由原来的2Bytes变成3Bytes

现在的计算机,内存都是unicode,硬盘都是utf-8。

 

unicode的两个特点
  1.用户在输入的时候,无论输什么字符都能够兼容万国字符
  2.其他国家编码的数据由硬盘读到内存的时候unicode与其他各个国家的编码都有对应关系
数据由内存保存到硬盘
内存中的unicode格式二进制数字 >>>>编码(encode)>>>>> utf-8格式的二进制数据
硬盘中的数据由硬盘读到内存
硬盘中的utf-8格式的二进制数据 >>>>>解码(decode)>>>>> 内存中unicode格式的二进制数据

保证不乱码在于:文本文件以什么编码编的就以什么编码解

python2,将py文件按照文本文件读入解释器中默认使用ASCII码(因为在开发python2解释器的unicode还没有盛行)

python3 ,将py文件按照文本文件读入解释器中默认使用utf-8

文件头 (coding:utf-8 )

1.因为所有的编码都支持英文字符,所以文件头才能够正常生效

基于Python解释器开发的软件,只要是中文,前面都需要加一个u
为了的就是讲python2(当你不指定文件头的时候,默认用ASCII存储数据,如果指定文件头那么就按照文件头的编码格式存储数据)

python3中字符串默认就是unicode编码格式的二进制数

补充:
1.pycharm终端用的是utf-8格式
2.windows终端采用的是gbk

x = '上'
res1 = x.encode('gbk') # 将unicode编码成可以存储和传输的utf-8的二进制数据
print(res1) # b'\xe4\xb8\x8a'
# bytes类型 字节串类型 你就把它当成二进制数据即可
res2 = res1.decode('gbk') # 将硬盘中的utf-8格式的二进制数据解码成unicode格式的二进制数据
print(res2)

 文件处理

1、什么是文件?
操作系统提供给用户操作复杂硬件(硬盘)的简易的接口

2、为什么操作文件

人或者应用程序需要永久的保存数据

3、如何用
f = open()
f.read()
f.close()
"""
通过python代码操作文件
r取消转义

f = open(r'D:\Python项目\day07\a.txt',encoding='utf-8') # 向操作系统发送请求 打开某个文件
 # 应用程序要想操作计算机硬件 必须通过操作系统来简介的操作
print(f) # f是文件对象
print(f.read()) # windows操作系统默认的编码是gbk
f.read() # 向操作系统发请求 读取文件内容
f.close() # 告诉操作系统 关闭打开的文件
print(f)
print(f.read())

  

文件上下文操作

with open(r'D:\Python项目\day07\a.txt',encoding='utf-8') as f ,\
open(r'D:\Python项目\day07\b.txt',encoding='utf-8') as f1: # f仅仅是一个变量名 你把它看成是一个遥控器
print(f)
print(f.read())
print(f1)
print(f1.read())
View Code

 

 


文件打开的模式
1、r 只读模式/

2、w 只写模式

3、追加写模式
操作文件单位的方式
t 文本文件 t在使用的时候需要指定encoding参数 如果不知道默认是操作系统的默认编码
b 二进制 一定不能指定encoding参数
mode参数 可以不写 不写的话默认是rt 只读的文本文件 这个t不写默认就是t

with open(r'D:\Python项目\day07\a.txt',mode='r',encoding='utf-8') as f:
print(f.readable()) # 是否可读
print(f.writable()) # 是否可写
print(f.read()) # 一次性将文件内容全部读出

with open(r'D:\Python项目\day07\1.jpeg',mode='rb') as f:
print(f.readable()) # 是否可读
print(f.writable()) # 是否可写
print(f.read()) # 一次性将文件内容全部读出
View Code

 

r模式在打开文件的时候 如果文件不存在 直接报错
文件路径可以写相对路径 但是需要注意该文件必须与执行文件在同一层文件下

with open(r'a.txt',mode='r',encoding='utf-8') as f:
with open(r'a.txt','r',encoding='utf-8') as f1: mode关键字可以不写
print(f.readable()) # 是否可读
print(f.writable()) # 是否可写
print(">>>1:")
print(f.read()) # 一次性将文件内容全部读出
print('>>>2:')
print(f.read()) # 读完一次之后 文件的光标已经在文件末尾了,再读就没有内容了可读
print(f.readlines()) # 返回的是一个列表 列表中的一个个元素对应的就是文件的一行行内容
for line in f: # f可以被for循环 每for循环依次 读一行内容
print(i) # 这个方法 就可以解决大文件一次性读取占用内存过高的问题
print(f.readline()) # 只读取文件一行内容
print(f.readline())
print(f.readline())
print(f.readline())
View Code

 

w模式:w模式一定要慎用

1.文件不存在的情况下 自动创建该文件
2.当文件存在的情况下 会先清空文件内容再写入

with open(r'xxx.txt',mode='w',encoding='utf-8') as f:
print(f.readable()) # 是否可读
print(f.writable()) # 是否可写
f.write('不不不,你没有翻~\n')
f.write('不不不,你没有翻~\n')
f.write('不不不,你没有翻~\n')
f.write('不不不,你没有翻~\r')
f.write('不不不,你没有翻~')
l = ['不sdffs,sdfs有翻~\n','不sdfsdf不,你sdfsf翻~\n','不sfad不,你没sa翻~\n']
# 上下等价
for i in l:
f.write(i)
View Code

 

a模式
1.当文件不存在的情况下 自动创建该文件
2.当文件存在的情况下,不清空文件内容, 文件的光标会移动文件的最后

with open(r'yyy.txt',mode='a',encoding='utf-8') as f:
print(f.readable()) # 是否可读
print(f.writable()) # 是否可写
f.write('我是小尾巴\n')
View Code

 

posted @ 2019-07-05 23:53  Aomur  阅读(406)  评论(0编辑  收藏  举报