7-5字符编码和文件处理

一.字符编码

1.1什么是字符编码

计算机是基于电工作的,换而言之计算机只能识别二进制数(0,1),让计算机能懂得人类的语言,也就是如何将是实现字符到数字的过程,一个字符如何对应一个特定数字的标准,这个标准称之为字符编码。

1.2字符编码的发展史

1.ASCII码表

用8位二进制数(1Bytes)表示一个英文字符,数量最多可至256个(0-255/0000 0000-1111 1111)

2.各国各自制定的编码表

为了满足中文和英文的需求,中国制定了GBK

GBK:2Bytes表示一个中文字符,1Bytes表示一个英文字符

日本制定了shift_JIS

韩国人制定了Euc_kr

3.统一标准

unicode:统一用2个Bytes表示一个字符

unicode的缺点:

1.浪费存储空间

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

unicode的优点:

1.能兼容万国字符

2.其他国家的编码数据由硬盘读到内存的时候Unicode与其他国家的编码都有对应关系

对于全是英文的文章来说,Unicode的样式多了一倍的存储空间,这样太过浪费,所以后来出现了utf-8。在utf-8中对英文字符采用1Bytes表示,对中文字符采用3Bytes表示。

现状:

内存中采用Unicode

硬盘中采用utf-8

4.编码和解码过程

编码(encode):

数据由内存保存到硬盘

1.内存中的unicode格式二进制数>>>>编码(encode)>>>>>utf-8格式的二进制数据

硬盘中的数据由硬盘到内存

1.硬盘中的utf-8格式的二进制数据>>>>解码(decode)>>>>>内存中的Unicode格式的二进制数据

ps:1.如何保证不乱码在于文件用什么编码编写的就用什么编码解

        2.关于python2和python3的区别

  在pytho2中按照文本文件读入解释器中默认使用ascii码(unicode还没盛行)

  在python3中按照文本文件读入解释器默认使用的是utf-8

文件头:# condong:(字符编码)  eg:(# conding:utf-8)

写在文件的开头,让解释器以规定的字符编码来解读文件

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

二.文件处理

2.1什么是文件

操作系统暴露给我们操作复杂硬件(硬盘)的简易接口

2.2为什么操作文件

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

2.3如何用文件

f=open()

f.read()

f.close()

2.4如何通过python代码操作文件

使用open命令如:

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

ps:如要打开a.txt在输入文件路径时可以采用绝对路径也就是文件的全部路径名称,也可以采用相对路径,加入文件在‘day07’文件夹下,此刻有另一个‘day07’下文件夹b.txt可以直接输入r'a.txt',encoding='utf-8'打开文件

2.5文件上下文操作

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

2.6文件打开模式

t:操作文件内容都是以字符串为单位,会自动帮我们解码,必须指定encoding参数

b:操作文件都是以Bytes(二进制)为单位,硬盘中存的是什么就取出来什么一定不能指定encoding参数
ps:文件的打开模式一定要和打开方式一起使用如“rt”,其中t模式只能用于文本文件,b模式可以用于任何文件

2.7文件打开的方式

r:只读模式

w:只写模式

a:追加写模式

r模式:只读模式,如果打开的文件存在则光标跳到文件的开头,如果文件不存在则会报错

with open(r'D:pythonpython练习a.txt',mode = 'rt',encoding = 'utf-8') as f:
    print(f.readable())  # 是否可读   True
     print(f.writable())  # 是否可写  False
     print(f.read())  # 一次性将文件内容全部读出
   

ps:其中mode参数可以不写,不写默认是rt模式,只读的文本文件,其中rt中的t不写可以不写

with open(r'D:pythonpython练习a.txt') as f:
      pass

相对路径:

with open(r'数据类型分类.jpg',mode='rb') as f:
    pass

rb模式:

with open(r'C:Users何晓东Desktop上课截图数据类型分类.jpg',mode='rb') as f:
    print(f.readable())  # 是否可读  True
    print(f.writable())  # 是否可写  False
    print(f.read())  # 一次性将文件内容全部读出
with open(r'D:pythonpython练习a.txt',mode = 'rt',encoding = 'utf-8') as f:
    print(f.readable())  # 是否可读
    print(f.writable())  # 是否可写
    print(">>>1:")
    print(f.read())  # 一次性将文件内容全部读出
    print('>>>2:')
    print(f.read())  # 读完一次之后 文件的光标已经在文件末尾了,再读就没有内容了可读
    print(f.readlines())  # 返回的是一个列表  列表中的一个个元素对应的就是文件的一行行内容  由于光标在最后返回为[]
    print(f.readline())  # 只读取文件一行内容
 

w模式:只写模式,打开的文件若不存在则新建该文件,若存在则打开并清空其中内容然后在写入(慎用)

with open(r'D:pythonpython练习a.txt',mode = 'wt',encoding = 'utf-8') as f:
    print(f.readable())  # 是否可读
    print(f.writable())  # 是否可写
    f.write('学习使我快乐,我爱学习
')
    f.write('学习使我快乐,我爱学习
')
    f.write('学习使我快乐,我爱学习
')
    f.write('学习使我快乐,我爱学习
')
    f.write('学习使我快乐,我爱学习
')
    l = ['学乐,我学习
','学习使我快乐,我习
','学乐,我爱学习
']
    f.writelines(l)  # 输入多行
  

a模式:追加写模式 打开的文件若不存在,会自动创建该文件,若已存在则会打开文件不清空内容并把光标移至最后

with open(r'D:pythonpython练习a.txt',mode = 'a',encoding = 'utf-8') as f:
   print(f.readable())  # 是否可读  False
    print(f.writable())  # 是否可写  True
    f.write('我超爱学习
')
原文地址:https://www.cnblogs.com/z929chongzi/p/11140410.html