Python/Python 文本处理的编码
在 Python 3 中读写文件时,我们需要注意读取文件和写入文件时的数据格式,是 str 类型,还是 byte 类型。
在我看来,str 类型相当于 Java 中的字符流,是有一个编码的;而 byte 相当于 Java 中的字节流,是没有编码的。
Unicode 是字符集,不是字符编码。Unicode 把全世界的字符都搜集并且编号了,但是没有规定具体的编码规则。
而编码规则有 UTF-8、GBK、ASCII 等等。
在计算机中,所有的数据底层都是字节,字符是根据一定规则,对字节进行编码得到的,适合人类看的一个 东西。
byte 和 str 转换
把 str 转换为 byte
使用 encode
方法可以把 str 转换为 byte
1 | a='I am str' |
输出是:
1 | a type is : <class 'str'> |
还可以在 encode
方法中指定编码格式,以一定的格式,把 str 转换为 byte,默认的编码格式是 UTF-8。
下面以 UTF-16 的格式来转换
1 | a='I am str' |
把 byte 转为 str
使用 decode
方法可以把 byte 转换为 str
1 | a = a_byte.decode() |
输出是
1 | I am str |
还可以在 decode
方法中指定编码格式,以一定的格式,把 byte 转换为 str,默认的编码格式是 UTF-8。
下面以 UTF-16 的格式来转换:
1 | a = a_byte_utf16.decode(encoding="utf-16") |
输出是
1 | I am str |
注意,encode
和 decode
的编码规则需要一致,否则转换后会乱码。
文件读写
在 python 中,我们使用 open()
方法来读写文件 ,有 mode
参数和 encoding
参数。
mode
- r:打开只读文件,该文件必须存在。
- r+:打开可读写的文件,该文件必须存在。
- w:打开只写文件,若文件存在则先删除文件内容再新建。若文件不存在则建立该文件。
- w+:打开可读写文件,若文件存在则先删除文件内容再新建。若文件不存在则建立该文件。
- a:以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
- a+:以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
- b:以 byte 的形式打开文件(默认是以 str 的格式打开文件)。
下面我们来看下 encoding
参数,encoding
参数默认是 utf-8
。如果你的文件格式不是 utf-8
,那么需要指定这个参数。
例如:
不使用 b
如果我们以 utf-16
的编码格式,把数据保存到文件中(使用 w+
)。
1 | txt_file = 'test_file.txt' |
那么读取时,需要使用 utf-16
的格式读取(使用 r
):
1 | txt_file = 'test_file.txt' |
使用 b
如果使用
b
参数进行写入(使用wb+
),在写入之前,需要使用encode
把 str 转换为 byte。这时,在open()
方法中不需要使用encoding
参数指定编码。1
2
3
4
5
6txt_file = 'test_file.txt'
f = open(txt_file, "wb+")
data = 'I am str'
data = data.encode(encoding='utf-16')
f.write(data)
f.close()如果使用
b
参数进行读取(使用rb
),在读取之后,需要使用decode
把 byte 转换为 str。这时,在open()
方法中不需要使用encoding
参数指定编码。1
2
3
4
5
6txt_file = 'test_file.txt'
f = open(txt_file, "rb")
data = f.read()
data = data.decode(encoding='utf-16')
print(data)
f.close()