这是全栈数据工程师养成攻略系列教程的第五期:5 实战 西游记用字统计。
我们将通过一个简单的实战项目,来巩固之前学习的Python基础。
数据
所使用的数据可以在我的Github上找到,https://github.com/Honlan/fullstack-data-engineer。将整个项目下载下来之后,里面的data文件夹中便包含了课程所需的全部数据和文件。
这次我们将用到xyj.txt
,里面是小说巨著《西游记》的文本内容,使用UTF8
编码,文件大小为2.2MB。文学大师吴承恩毕生的作品,如今用2M左右的文件就可以全部存储,这正是信息时代所带来的进步和便利。
目标
我们将读入《西游记》的文本内容,并进行以下统计:
- 共出现了多少个不同的汉字;
- 每个汉字分别出现了多少次;
- 哪些汉字出现得最为频繁。
在xyj.txt
的同级目录下,新建一个py
文件,然后开始写代码吧!
步骤
首先,定义一个读文件,读取准备好的xyj.txt
。
fr = open('xyj.txt', 'r')
准备一个列表characters和一个字典stat,分别用来记录所出现的汉字和每个汉字出现的次数。
characters = []
stat = {}
接下来遍历读文件中的每一行,并进行统计。统计结果显示,《西游记》中共出现了4511个不同的汉字。
for line in fr:
# 去掉每一行两边的空白
line = line.strip()
# 如果为空行则跳过该轮循环
if len(line) == 0:
continue
# 将文本转为unicode,便于处理汉字
line = unicode(line)
# 遍历该行的每一个字
for x in xrange(0, len(line)):
# 去掉标点符号和空白符
if line[x] in [' ', '\t', '\n', '。', ',', '(', ')', '(', ')', ':', '□', '?', '!', '《', '》', '、', ';', '“', '”', '……']:
continue
# 尚未记录在characters中
if not line[x] in characters:
characters.append(line[x])
# 尚未记录在stat中
if not stat.has_key(line[x]):
stat[line[x]] = 0
# 汉字出现次数加1
stat[line[x]] += 1
print len(characters)
print len(stat)
接下来对stat按值进行排序,排序之后会得到一个列表,因为字典是无序的,而列表是有序的。
# lambda生成一个临时函数
# d表示字典的每一对键值对,d[0]为key,d[1]为value
# reverse为True表示降序排序
stat = sorted(stat.iteritems(), key=lambda d:d[1], reverse=True)
定义一个写文件,将统计和排序结果写入文件。
fw = open('result.csv', 'w')
for item in stat:
# 进行字符串拼接之前,需要将int转为str
fw.write(item[0] + ',' + str(item[1]) + '\n')
最后,记得关闭读文件和写文件。
fr.close()
fw.close()
总结
通过这样的一个简单项目,我们温习了Python中的读文件和写文件,列表和字典的使用,以及字典的排序等内容。Python的功能很强大,打开你的脑洞,用Python去完成一些你能想到的事情吧~
视频链接:西游记用字统计
网友评论