11.3Python桌面应用开发(3):词频统计器

@导入依赖

import os # 操作路径
import re # 用于描述英文单词构成
from collections import Counter # 字符统计器
from tkinter import filedialog # 文件路径对话框
from tkinter import * # GUI

@词频统计器实现

class DirectionDocWordCounter:
    def __init__(self):

        # 定义排版边距
        marginx = 5
        marginy = 5

        # 窗口和标题
        window = Tk()
        window.title("词频统计器")

        # 使用StringVar对象动态保管打开的文件夹位置
        self.dirPath = StringVar()
        self.dirPath.set("请选择要打开的文件夹")

        # 第一行控件打包在一个面板中
        frame1 = Frame()
        frame1.pack(padx=marginx, pady=(marginy, 0))

        # 打包地址输入框、地址选择按钮在面板1中
        Entry(frame1, width=50, textvariable=self.dirPath).pack(side=LEFT)
        Button(frame1, text="选择文件夹", command=self.openDir).pack(side=LEFT, padx=(marginx, 0))

        # 词频统计按钮
        Button(width=60, text="统计txt文件词频", command=self.doCalculate).pack(padx=marginx, pady=(marginy, 0))

        # 面板2用于盛放文本域和滚动条
        frame2 = Frame()
        frame2.pack(padx=marginx, pady=(marginy, marginy),expand=True,fill=Y)

        # 打包文本域和滚动条在面板2中
        self.retText = Text(frame2, width=58, height=20, bg="white")
        scrollbar = Scrollbar(frame2,orient=VERTICAL,bg="black")
        self.retText.pack(side=LEFT,expand=True,fill=Y)
        scrollbar.pack(side=LEFT,expand=True,fill=Y)

        # 双向关联文本域和滚动条
        self.retText.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=self.retText.yview)

        # 消息循环
        window.mainloop()

    def openDir(self):
        # 选择要打开的文件夹路径
        self.dirPath.set(filedialog.askdirectory() + "/")

    def doCalculate(self):
        # 统计该文件下的词频
        self.countDocWordsInDir(self.dirPath.get())

    # 获得单个文档词频统计的计数器对象Counter
    def getFileCounter(self, filepath):

        # 拿到文本
        file = open(filepath, "r", encoding="utf-8")
        text = file.read()

        # 英文单词的正则表达式
        pattern = "[A-Za-z]+"

        # 从text中找出所有英文单词形成列表
        wordlist = re.findall(pattern, text)

        # wordlist的基础上创建Counter对象
        counter = Counter(wordlist)

        # 返回单个文件的计数器对象
        return counter

    # 统计一个文件夹下所有文档的一揽子词频
    def countDocWordsInDir(self, dirpath):

        # 罗列一个文件下的所有文件(含文件夹)
        flist = os.listdir(dirpath)

        # 创建空的计数器对象,统计对象通过counter对象的加法操作逐步扩大
        mcounter = Counter()

        # 遍历文件夹下的所有文件
        for name in flist:

            # 对文档文件进行统计操作
            if name.endswith(".txt"):
                docpath = dirpath + name  # 获得文档文件的路径

                # 获得文档的计数器对象
                counter = self.getFileCounter(docpath)

                # 计数器对象进行加法操作,扩大统计样本
                mcounter += counter

        # 得到结果
        resList = mcounter.most_common()
        print(resList)

        # 显示结果
        for item in resList:
            self.retText.insert(END, str(item) + "\n")

@创建词频统计器对象

if __name__ == '__main__':
    DirectionDocWordCounter()
    pass

@执行结果
11.3Python桌面应用开发(3):词频统计器_第1张图片

你可能感兴趣的:(Python,语言程序设计,Python语言程序设计)