python作业:编写程序,用户在命令提示行输入文件名和该文件的编码格式,读入文件,将其转存成UTF-8格式。如果用户没有指定输入文件的编码格式,则使用chardet模块“猜”出其编码格式,用于解码。使用argparse模块解析用户命令提示行输入。
调查资料和解:
1、argparse模块是用于给用户提供命令行选项和参数解析的模块
# 1导入模块
import argparse
# 2.建立解析对象
parser=argparse.ArgumentParser()
# 3.增加属性,添加帮助,指定类型为int
parser.add_argument("square",help="To square the number given",type=int)
# 4实例化对象 args
args=parser.parse_args()
# 5打印参数echo
print(args.square**2)
2、if__name__=='__main__':
通俗的理解__name__ == '__main__'
:假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明')
;在你自己眼中,你是你自己(__name__ == '__main__')
。
if __name__ == '__main__'
的意思是:当.py文件被直接运行时,if __name__ == '__main__'
之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'
之下的代码块不被运行。
假设我们有一个const.py文件,内容如下:
PI = 3.14
def main():
print("PI:", PI)
main()
# 运行结果:PI: 3.14
现在,我们写一个用于计算圆面积的area.py文件,area.py文件需要用到const.py文件中的PI变量。从const.py中,我们把PI变量导入area.py:
from const import PI
def calc_round_area(radius):
return PI * (radius ** 2)
def main():
print("round area: ", calc_round_area(2))
main()
'''
运行结果:
PI: 3.14
round area: 12.56
'''
我们看到const.py中的main函数也被运行了,实际上我们不希望它被运行,因为const.py提供的main函数只是为了测试常量定义。这时if __name__ == '__main__'
派上了用场,我们把const.py改一下,添加if __name__ == "__main__"
:
PI = 3.14
def main():
print("PI:", PI)
if __name__ == "__main__":
main()
运行const.py,输出如下:
PI: 3.14
运行area.py,输出如下:
round area: 12.56
3、chardet.detect()函数
首先,介绍一下chardet.detect()函数
detect()函数接受一个参数,一个非unicode字符串。它返回一个字典,其中包含自动检测到的字符编码和从0到1的可信度级别。
返回的内容有三个:
encoding:表示字符编码方式。
confidence:表示可信度,也可以理解为检测的概率。
language:语言。
我们用这个函数来分别检测gbk,utf-8,日文
import chardet
str1 = "离离原上草,一岁一枯荣".encode('gbk')
str2 = "野火烧不尽,春风吹又生".encode('utf-8')
str3 = "こんにちは".encode('euc-jp')
print(chardet.detect(str1))
print(chardet.detect(str2))
print(chardet.detect(str3))
检测结果如下:
{'encoding': 'GB2312', 'confidence': 0.7407407407407407, 'language': 'Chinese'}
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
{'encoding': 'EUC-JP', 'confidence': 0.99, 'language': 'Japanese'}
# 其中GBK是GB2312的子集,所以说检测结果是正确的
大概率其实都是正确的。
这里检测的结果返回的是字典,而我们需要的是encoding的内容,即
chardet.detect()['encoding']
4、作业:
import argparse
from pip._vendor import chardet
if __name__ == '__main__':
# 构建命令行参数的参数
parser = argparse.ArgumentParser(description='change into the type of UTF-8')
parser.add_argument('-fl', '--filename', type=str, help='the name of file.')
parser.add_argument('-ty', '--type', type=str, help='the type of encoding.')
args = parser.parse_args()
etype = args.type
print(args.filename)
# 检测文件的编码格式
with open(args.filename, 'rb') as f:
fileData = f.read()
if not etype:
# 假使未输入编码格式
etype = chardet.detect(fileData)['encoding']
print("您未输入编码格式,通过检测,编码格式为:", etype)
# 编码转换成UTF-8,转存
f = open(args.filename, 'r', encoding=etype)
content = f.read()
print(content)
f.close()
f = open(args.filename, 'w', encoding='utf-8')
f.write(content)
f.close()
print("转存成功!")
- chardet模块(一个方法)
- argparse模块(三个方法)
- 命令行参数要输入绝对路径
5.map()
map()函数是Python中的一个内置函数,它的功能是:将指定的函数,依次作用于可迭代对象的每个元素,并返回一个迭代器对象。这个可迭代对象,可以是一个也可以是多个。