文件操作

最前面的

参考1_史诗级讲解计算机字符编码的前世今生

了解编码

文件的编码

简单一点说就是将字符转换成数字来存储

编码(Encode)是信息从一种形式转换为另一种形式的过程,比如用预先规定的方法将字符(文字、数字、符号等)、图像、声音或其它对象转换成规定的电脉冲信号或二进制数字。

编码转换过程

  1. 英文
    键盘和ASCII码直接对应,按下按键,存储相对应的二进制数字。

  2. 中文

    1. 输入码 利用按键字母组合和汉字建立映射表
    2. 机内码 计算机内部真正存储和交换的二进制编码
    3. 字形码 就是nxn的像素点阵,预先存在计算机当中,字形码的集合就叫字库。

字形码
不同的字库(如宋体、黑体)对同一个字符的字形编码是不同的。
其实我们也可以认为字符编码是字形码的一种压缩方式,一个占32字节的像素点阵压缩成了2字节的机内码。
image

现代编码模型

  1. 第一层抽象字符集 ACR
    将所有的抽象字符作为一个集合,这个集合不但包括有形的字符,也包括无形的控制字符。
    在这个集合里面,同一个字符可能会有多种表现形式,就像一个汉字有黑体,篆体,宋体等不同的表现,但是他们都属于同一个抽象字符,至于如何显示是字形库的事。

  2. 第二层 编号字符集 CCS
    就是对抽象字符集里的每个字符进行编号,映射到一个非负整数的集合。
    将字符转换成数字

  3.  第三层:字符编码方式 CEF
    就是将上面的数字编号,转换成二进制序列
    注意这里不是直接转换过去的。

  4.  第四层:字符编码方案 CES
    将二进制序列在计算机中具体存储,
    主要是计算机中大小端序的问题。

常见的编码

ASCII码

8位一个字节(256个状态)
一共规定了128个字符的编码
最前面一位为0

ISO-8859-N

和ASCII一样是一个字节。
最前面一位是0时就是ASCII
最前面一位是1时,表示扩展的欧洲字符
多种变种

GB系列

在一段文本中,如果一个字节是 0~127,那么这个字节的含义与 ASCII 编码相同,否则,这个字节和下一个字节共同组成汉字(或是 GB 编码定义的其他字符)

  1. GB2312
    2个字节
    规定表示一个汉字的编码字节其值必须大于 127(即字节的最高位为 1),并且必须是两个大于 127 的字节连在一起来共同表示一个汉字

  2. GBK
    同样是2字节编码,但是只要求第一个字节大于 127 就固定表示这是一个汉字的开始。

ANSI编码

ANSI 编码只是一个范称,一般代表系统默认的编码方式,而且并不是确定的某一种编码方式—— 比如在 Windows 操作系统里,中国区 ANSI 编码指的是 GB 编码,在香港地区 ANSI 编码指的是 Big5 编码,在韩国 ANSI 编码指的是 EUC-KR 编码。

Unicode

它为每种语言中的每个字符设定了统一并且唯一的二进制编码。
是一套字符编码体系,而不仅仅是字符编号。

UTF-8、UTF-16、UTF-32 都是将数字转换到实际的二进制编码实现,Unicode 的编码实现除了 UTF 系列之外,还有 UCS-2/4,GB18030 等。但是现在很多人误把 Unicode 当成只是一个字符编号,这其实是不对的。

UTF-16
2个字节

Big5 繁体字经常用

python文件的基本操作

打开文件(获取文件对象)

  1. open方法
    encoding不是第三位,必须用关键词参数
    返回值是文件对象
1
f = open("python.txt","r", encoding="UTF-8")

image

读取文件

文件对象打开后,使用任何方法读取文件,都会续接上一次读取文件的方法。

  1. read方法
1
2
f.read(10)   # 读取10字节
f.read() # 读取全部内容
  1. readLines方法
    line = f.readLines() # 读取文件的全部行,封装到列表中。

  2. readLine方法
    line = f.readLine() # 读取一行数据

  3. 使用for循环 # 每次循环读取一行文件

1
2
3
for line in open("python.txt","r"):
print(line)

写入文件

f = open("python.txt","w")
f = open("python.txt","a")

1
f.write("hello world")  # 将数据写入内存中(缓冲区)

关闭文件

程序运行过程中会持续占用文件,没有调用close,文件将一直被python程序占用。
f.close() # 关闭文件对象

使用with open打开文件

with open内部语句执行完成之后,不用close(),会自动关闭文件对象

1
2
3
with open("python.txt","r", encoding="UTF-8") as f :
for line in f:
print(line)