Python/Python 文本处理的编码

Python/Python 文本处理的编码

在 Python 3 中读写文件时,我们需要注意读取文件和写入文件时的数据格式,是 str 类型,还是 byte 类型。

在我看来,str 类型相当于 Java 中的字符流,是有一个编码的;而 byte 相当于 Java 中的字节流,是没有编码的。

先搞清楚几个概念:

  • Unicode 是字符集,不是字符编码。Unicode 把全世界的字符都搜集并且编号了,但是没有规定具体的编码规则。

  • 而编码规则有 UTF-8、GBK、ASCII 等等。

  • 在计算机中,所有的数据底层都是字节,字符是根据一定规则,对字节进行编码得到的,适合人类看的一个 东西。

byte 和 str 转换

把 str 转换为 byte

使用 encode 方法可以把 str 转换为 byte

1
2
3
4
a='I am str'
print('a type is : ',type(a))
a_byte = a.encode()
print('a_byte type is : ',type(a_byte))

输出是:

1
2
a type is :  <class 'str'>
a_byte type is : <class 'bytes'>

还可以在 encode 方法中指定编码格式,以一定的格式,把 str 转换为 byte,默认的编码格式是 UTF-8。

下面以 UTF-16 的格式来转换

1
2
a='I am str'
a_byte_utf16 = a.encode(encoding="utf-16")

把 byte 转为 str

使用 decode 方法可以把 byte 转换为 str

1
2
a = a_byte.decode()
print(a)

输出是

1
I am str

还可以在 decode 方法中指定编码格式,以一定的格式,把 byte 转换为 str,默认的编码格式是 UTF-8。

下面以 UTF-16 的格式来转换:

1
2
a = a_byte_utf16.decode(encoding="utf-16")
print(a)

输出是

1
I am str

注意,encodedecode 的编码规则需要一致,否则转换后会乱码。

文件读写

在 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
2
3
4
5
6
txt_file = 'test_file.txt'
f = open(txt_file, "w+", encoding='utf-16')
data = 'I am str'

f.write(data)
f.close()

那么读取时,需要使用 utf-16 的格式读取(使用 r):

1
2
3
4
5
6
txt_file = 'test_file.txt'
f = open(txt_file, "r", encoding='utf-16')
data = f.read()

print(data)
f.close()

使用 b

  • 如果使用 b 参数进行写入(使用 wb+),在写入之前,需要使用 encode 把 str 转换为 byte。这时,在 open() 方法中不需要使用 encoding 参数指定编码。

    1
    2
    3
    4
    5
    6
    txt_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
    6
    txt_file = 'test_file.txt'
    f = open(txt_file, "rb")
    data = f.read()
    data = data.decode(encoding='utf-16')
    print(data)
    f.close()

评论