简介
最近看到了一本好书,名字叫《Python全栈数据工程师养成攻略》,随便翻翻感觉对个人学习颇有裨益,故打算跟着书上的实例学完它。本书采用Python2.7和Subline编辑器,不过由于个人做数据科学经常用的是Anaconda里面的几款编辑器,所以本次实例采用Python3.5和Spyder编辑器,并且对原项目的语法上进行了一些修改。
本次实例比较基础,就不做过多说明了。
数据源
本项目中采用读取txt文件的方式进行字频统计,所以选择了知名网文《雪中悍刀行》进行读取,从小说网站上下载得到txt文件,并重新保存至utf8格式,得到我们接下来要使用的"xzutf8.txt"文件,大小为13.5MB,字数还是非常多的。
目标
- 统计共出现了几个不同的汉字(分类)。
- 每个汉字共出现了几次(频数)。
- 哪些汉字出现的最频繁(排序)。
步骤
第一步:读取准备好的"xzutf8.txt"文件,并创建一个list()和一个dict{}存放相关内容。
# -*- coding: utf-8 -*-
'''
由于读取写入都有中文,本次案例统一采用utf8编码
'''
fr = open('xzutf8.txt','r',encoding ="utf8") #读取雪中悍刀行小说文件
characters = [] #存放出现的汉字
stat = {} #存放每个汉字的出现次数
第二步:对每一行进行遍历并统计文字。
'''
for循环遍历每一行文字
对于文件中每一行用strip方法去掉空格
如果那行为空则用continue跳过
'''
for line in fr:
line = line.strip()
if len(line) == 0:
continue
for x in range(0,len(line)): #对每一行内文字进行扫描
if line[x] in [' ','\t','\n','。',',',
'(',')','(',')',':',':','-','?',
'!','《','》','、',';','“','”','□','……']:
continue #跳过标点符号
if not line[x] in characters:
characters.append(line[x]) #出现新字符添加进list
if not line[x] in stat: #出现新字符添加进字典
stat[line[x]] = 0
stat[line[x]] += 1 #相同字符次数+1
print(len(characters)) #不同字符数结果显示
fr.close() #读取完成退出
第三步,把字典转化为list进行排序,并将结果写入新的txt文件中。
'''
接下来对结果进行字数频数的排序
调用sort方法,对字典的值进行排序,True表示降序排序
将结果写入txt文件中
'''
stat = sorted(stat.items(),key = lambda d:d[1],reverse = True)
#d[1]即字典第二个属性值,文字出现次数
fw = open('result.txt','w',encoding="utf8")
for item in stat:
fw.write(item[0]+','+str(item[1])+'\n') #读取字典的两个属性并换行
fw.close() #写入完成退出
总结
以上是最后的结果,没想到"的"竟然是用的最多的,达到10万次…
还有这里的剑竟然有14000次,这个作者是有多喜欢剑啊,明明这本书主角是用刀的,所以不过瘾写了下一本主角用剑的小说《剑来》是吗,哈哈哈。
本次实例中涵盖了许多知识点,其中最容易出错的就是Python的中文编码问题,做项目时要格外小心,读者也可以去参考一下其他的资料来加深理解。
参考书目
[1]Python全栈数据工程师养成攻略(2017).张宏伦.人民邮电出版社.北京.