Python基本文本读写操作

前言

在计算机中,除了一些专用的文字处理软件 ,如Office,WPS等,最简单的文本文件(*.txt)反而是最流行和广泛使用的用于保存自然语言的数据格式。为了节省空间,文字会以某种编码的形式进行保存。在大多数的中文系统中,“ utf-8 ”或“ GBK ”是最常见的编码格式。文本文件的基本操作的原则是“以什么编码格式保存的,就以什么编码格式打开 ”。大部分常用的编码器都会支持这两种格式,因此这些编辑器,如系统自带的记事本或常见文档编辑器如Word,都不会出现因为编码不支持而产生的乱码的情况发生。然而我们在一个文本文件而不知道其编码的时候,就可能使用错误的编码来打开,从而导致乱码的产生。比如使用UTF-8打开GBK格式,或使用GBK打开UTF8。

1 解决办法

由于编码问题是一个非常常见的问题,因此现在已经有了解决方案。在Python中,有一个名为chardet的第三方Python包,就能够自动地通过分析文件的内容,来判断文档的编码格式,并给出检测结果。从而让我们在打开文档的时候,能够尽可能以正确的方式打开。

2 指定文件的编码格式

利用Windows自带的记事本,我们可以在保存的时候选择编码格式。如下图所示,我们可以选择其编码格式为ANSI即标准编码,再保存为ex5_1.txt。
在这里插入图片描述

小知识:为使计算机支持更多语言,通常使用 0x80~0xFFFF 范围的 2 个字节来表示 1 个字符。比如:汉字 ‘中’ 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准。这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文Windows操作系统中,ANSI 编码代表 GB2312编码;在繁体中文Windows操作系统中,ANSI编码代表Big5;在日文Windows操作系统中,ANSI 编码代表 JIS 编码。不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。ANSI编码表示英文字符时用一个字节,表示中文用两个或四个字节。ANSI编码作为中国以及部分亚太地区的多字符编码格式,Windows系统和OS X都是提供原生支持的。但是即便如此,许多国外开发者仍然在开发笔记或者文字录入类应用的时候将ANSI编码完全忽略,只加入全球通用的UTF-8编码。

3 使用Python创建文件

在Python中,创建一个文件可以使用open函数代码完成。我们可以用Python编写代码生成示例文件,内容如下所示:

f = open(file="ex5_1.txt",mode="w", encoding="gbk")
f.write("Hello, China. 你好,中国。")
f.close()

4 读写过程

已知文件保存的编码格式,则读取时,指定对应的编码格式即可正常读取。首先我们先新建一个文档,命名为 “ word1.txt ”,以“ utf-8 ”编码格式保存。在python中,我们方便地使用 open 来打开一个文件进行操作。open的打开方式有一个mode参数,可以使用“ r ” ,进行只读模式的操作,即只对文档进行读取不作修改;另一个常用的值是 “ rb ”,用于二进制的读取。

def test1(filename):
    print("----- default encoding -----")
    f = open(file=filename, mode="r")
    s = f.readline()
    f.close()
    print("s = ", s)

def test2(filename):
    print("----- gbk encoding -----")
    f = open(file=filename, mode="r", encoding="gbk")
    s = f.readline()
    f.close()
    print("s = ", s)
    
def test3(filename):
    print("----- utf-8 encoding -----")
    f = open(file=filename, mode="r", encoding="utf-8")
    s = f.readline()
    f.close()
    print("s = ", s)


test1("ex5_1.txt")
test2("ex5_1.txt")
test3("ex5_1.txt")

执行后的结果如下所示。

D:\data>py read.py
----- default encoding -----
s =  你好,中国。Hello, China.
----- gbk encoding -----
s =  你好,中国。Hello, China.
----- utf-8 encoding -----
Traceback (most recent call last):
  File "read.py", line 27, in <module>
    test3("ex5_1.txt")
  File "read.py", line 20, in test3
    s = f.readline()
  File "C:\ProgramData\Anaconda3\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte

可以发现前面两个函数的操作都正常,但是在使用utf-8打开文件时报错,提示无效的操作。这是因为编码内容的不同所导致的。

5 使用 chardet 库进行文本判断

由于文本文件是纯数据文件,不记录文件属性的内容,所以我们无法直接获文件的编码格式(很多文件格式会进行记录,比如在XML中,第一行会写 <?xml version="1.0" encoding="utf-8" ?> 同时会指定格式版本和编码格式)。
我们可以使用chardet 库来解决。使用 pip install chardet 即可安装。我们可以使用以下代码对两个文件进行检测。它的工作原理是先读取一定长度的数据,然后进行分析判断,再输出结果。示例代码如下:

import chardet

def getencoding(filename):
    with open(filename, 'rb') as file:
        data = file.read(100)
        dicts = chardet.detect(data)
    return dicts["encoding"]
    
print("ex5_1.txt encoding:", getencoding("ex5_1.txt"))
print("ex5_2.txt encoding:", getencoding("ex5_2.txt"))

代码执行完以后,结果如下所示:

ex5_1.txt encoding:  None
ex5_2.txt encoding: utf-8

其中 utf-8 表示 UTF-8格式,而None是没有识别出来,但是一般情况下可以理解为GBK。实际上,在 dicts 中共有三个参数:

  • encoding: 表示文件的编码格式,常见的值为 utf-8none
  • confidence: 取值范围为 0-99 越高表示可信度越高。
  • language: 表示编码的语言,如 “chinese”、“english”等。

小知识

gb2312 最开始的中文编码,后来由于长度不够进行了扩展(GBK中的K代表扩)
gbk 后来补充后的中文编码
unicode 万国码
utf-8
python2 默认的是ascii 编码方式 ,需要制定编码格式为utf-8,否者中文会报错
python3 默认的是utf-8编码方式
最初发明了计算机,计算机是美国人发明的,只考虑了英文字母、数字和一些常用符号,不支持中文和其他语言。于是中国人发明了gb2312编码格式,里面包含了6000多个汉字在计算机对应得ASCII,但是渐渐的发现,
这6000个不足以展示我大中华的汉字博大精深,于是后来出现了GBK,该编码编入了少数民族字,解决了这个问题后,发现中国发明的软件到别的国家不能正常显示,怎么办,于是就发明了unicode和UTF-8这样的万国码。

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页