全栈 - 5 实战 西游记用字统计

784 阅读2分钟

这是全栈数据工程师养成攻略系列教程的第五期:5 实战 西游记用字统计。

我们将通过一个简单的实战项目,来巩固之前学习的Python基础。

数据

所使用的数据可以在我的Github上找到,github.com/Honlan/full…。将整个项目下载下来之后,里面的data文件夹中便包含了课程所需的全部数据和文件。

这次我们将用到xyj.txt,里面是小说巨著《西游记》的文本内容,使用UTF8编码,文件大小为2.2MB。文学大师吴承恩毕生的作品,如今用2M左右的文件就可以全部存储,这正是信息时代所带来的进步和便利。

目标

我们将读入《西游记》的文本内容,并进行以下统计:

  1. 共出现了多少个不同的汉字;
  2. 每个汉字分别出现了多少次;
  3. 哪些汉字出现得最为频繁。

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去完成一些你能想到的事情吧~

视频链接:西游记用字统计

如果觉得文章不错,不妨点一下左下方的喜欢~