Python 编码检测与编码转换

这次的上机实验有一道关于编码的题目,如下:

编写程序,用户在命令提示行输入文件名和该文件的编码格式,读入文件,将其转存成UTF-8格式。如果用户没有指定输入文件的编码格式,则使用chardet模块“猜”出其编码格式,用于解码。使用argparse模块解析用户命令提示行输入。

老师上课并没有讲这两个模块,因此我便去了解了一下。简单来说,导入chardet模块后使用其中的dectect方法检测,会返回一个字典 


>>> chardet.detect(file.read())
{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}

encoding键值即是检测出的编码格式,confidence键值即是检测正确的概率。

而argparse模块是用于命令行选项与参数解析的模块,我们这里会用到的有如下三个方法:

1、使用 ArgumentParser() 创建对象

2、使用 add_argument() 添加参数

3、使用 parse_args() 解析添加的参数

代码如下:

import argparse
import chardet
parser=argparse.ArgumentParser(description='change encoding')
parser.add_argument('name',help='file name')
parser.add_argument('--encode',help='show encoding')
args=parser.parse_args()

#编码检测
with open(args.name,'rb') as f:    #注意要二进制读取 才能decode
    file_data=f.read()
    if not args.encode:             #若未输入编码格式,则检测
        args.encode=chardet.detect(file_data)['encoding']         #将返回的字典中对应的值赋给args.encode
    print(args.encode)       #打印原编码格式

#编码转换
f = open(args.name, "r", encoding=args.encode)       #以原编码格式打开
text=f.read()
f.close()
f = open(args.name,'w',encoding='utf-8')         #以utf-8编码格式打开
f.write(text)
f.close()
with open(args.name,'rb') as f:               #输出新的编码格式以检查是否转换成功
    print(chardet.detect(f.read())['encoding'])

运行结果:(文件内容为:好的)

我们使用命令行运行该py文件,先输入-h获取帮助,了解相关信息。

Python 编码检测与编码转换

 

现在,我们先输入一个参数,即文件地址(--encode为optional参数,可不输入)

Python 编码检测与编码转换

可以发现转换成功了。

最后,我们将两个参数都输入,我们看看输入编码格式为ascii会发生什么

Python 编码检测与编码转换

由于文件内容为中文,果然不能用ascii来解码,报错了。

 

最后:这道题弄了很久,但总算做出来了,应该是算做对了,放在这里记录一下。