这次的上机实验有一道关于编码的题目,如下:
编写程序,用户在命令提示行输入文件名和该文件的编码格式,读入文件,将其转存成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获取帮助,了解相关信息。
现在,我们先输入一个参数,即文件地址(--encode为optional参数,可不输入)
可以发现转换成功了。
最后,我们将两个参数都输入,我们看看输入编码格式为ascii会发生什么
由于文件内容为中文,果然不能用ascii来解码,报错了。
最后:这道题弄了很久,但总算做出来了,应该是算做对了,放在这里记录一下。