Python | 根据指定文件生成词云图

本文介绍了一款程序,能够批量处理目录下的中文、英文或中英文混合的文本文件,统计词汇频率并生成词云图。程序实现了文件读取、词汇统计、结果排序与输出等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任务:编写程序,编好后,把多个文本文件(中文、英文或中英文语言混合的文本文件,编码格式为UTF-8,扩展名为txt)放到程序所在目录。程序运行时,能把程序所在目录下所有文本文件找出来,并显示出文件基本名(基本名前面加上“X---”,X为序号,从1-N,N为文本文件的个数),用户输入某个序号后(输入错误,要提示重新输入,直到输入正确为止),便能够自动统计对应的文件中的中文词汇和英文单词的个数,按照个数由高到低排序,显示统计结果(即每个词汇和词汇出现的次数,并将结果存入另一个文本文件(编码格式采用UTF-8),并生成词云图,并把图显示出来。

程序流程:

代码:

        [注意] 代码运行需要自行安装 jieba库、wordcloud库

# -*- coding: utf-8 -*-
import os
import jieba
import wordcloud

def Read_fileName(nowPath):
    '''
    搜索指定目录下的 txt 文件,显示出文件基本名
    :param nowPath: 指定目录
    :return: 文件名列表
    '''
    fileList = []
    os.chdir(nowPath)  # 修改为.py文件所在目录(当前目录)

    for files in os.listdir(nowPath):
        if files.endswith('.txt'):
            fileList.append(os.path.join(files))
    for i in range(len(fileList)):
        print('{:d}--'.format(i+1) + fileList[i])
    return fileList


def Output_endTxt(fileList):
    '''
    输入指定文件,进行分词,统计,并输出Sort.txt文件
    :param fileList: 文件名列表
    :return: Sort.txt文件
    '''
    f = None
    try:
        fileName = fileList[int(input('请输入列表中文件的序号:'))-1]
        f = open(fileName , 'r', encoding='utf-8')

        # 创建目录存放结果
        newPath = Create_path()
        # 分词 --> Jieba.txt
        Jieba(fileName,newPath)
        # Jieba.txt --> Sort.txt
        Sort(Account(Turn()))

    except IndexError or ValueError or FileNotFoundError:
        print('无法打开指定文件,请重新输入!')
        Output_endTxt(fileList)
    finally:
        if f:
            f.close()



def Create_path():
    '''
    当前目录下创建一个新目录 Result 存放 Jieba.txt , Sort.txt , 词云图
    :return: 创建的目录
    '''
    try:
        newPath = os.getcwd() + "\\" + 'Result' + "\\"
        if not os.path.exists(newPath):
            os.makedirs(newPath)
        return newPath
    except BaseException as msg:
        print("新建目录失败:" + msg)


def Jieba(fileName,filePath):
    '''
    调用jieba库,对输入文件进行分词,结果保存至Jieba.txt文件
    :param fileName: 传入文件的名字
    :param filePath: 结果要保存到的目录
    :return: Jieba.txt文件
    '''
    with open(fileName, 'r', encoding='utf-8') as f:
        cutWord = jieba.cut(f.read())
    result = " ".join(cutWord)

    result = result.replace(' : ', ' ')
    result = result.replace(' ; ', ' ')
    result = result.replace(' ! ', ' ')
    result = result.replace(' 、 ', ' ')
    result = result.replace(' ” ', ' ')
    result = result.replace(' “ ', ' ')
    result = result.replace(' — ', ' ')
    result = result.replace(' — ', ' ')
    result = result.replace(' - ', ' ')
    result = result.replace(' , ', ' ')
    result = result.replace(' . ', ' ')
    result = result.replace(' , ', ' ')
    result = result.replace(' 。 ', ' ')
    result = result.replace(' 》 ', ' ')
    result = result.replace(' 《 ', ' ')
    result = result.replace(' ) ', ' ')
    result = result.replace(' ( ', ' ')
    result = result.replace('   ', ' ')

    os.chdir(filePath)     # 修改当前目录
    fp = open('Jieba.txt', 'w', encoding='utf-8')
    fp.write(result)
    fp.close()


def Turn():
    '''
    将 Jieba_txt文件 分组转化为列表
    :return: 结果列表 wordList
    '''
    with open('Jieba.txt', 'r', encoding='utf-8') as f:
        wordList = []
        for wordStr in f.readlines():
            wordStr = wordStr.strip()
            wordLine = wordStr.split(' ')
            wordList.extend(wordLine)
        return wordList


def Account(wordList):
    '''
    统计 wordList 的词频
    :param wordList: 待统计的列表
    :return: 统计的结果
    '''
    accountDict = {}
    for i in wordList:
        accountDict[i] = wordList.count(i)
    return accountDict


def Sort(accountDict):
    '''
    对字典进行排序,并保存到Sort.txt中
    :param accountDict: 排序前的字典
    :return: 排序后的字典
    '''
    sortDict = sorted(accountDict.items(), key=lambda d: d[1], reverse=True)
    sortDict = dict(sortDict)
    Print_sortDict(sortDict)

    clearStr = str(sortDict)
    clearStr = clearStr.replace('\'','')
    fp = open('Sort.txt', 'w', encoding='utf-8')
    fp.write(clearStr)
    fp.close()


def Print_sortDict(sortDict):
    '''
    打印统计排序的结果
    :param sortDict: 排序后的字典
    '''
    i = 0
    print('\n======统计结果:======')
    for x, y in sortDict.items():
        if i < len(sortDict):
            print('(\'%s\',%s)'%(x,y))
            i += 1
            continue
        else:
            break


def Print_picture():
    '''
    输出词云图
    '''
    fb = open('Sort.txt', 'r', encoding='utf-8')
    txt = fb.read()
    fb.close()
    w = wordcloud.WordCloud(font_path='msyhbd.ttc',
                            width=800,
                            height=500,
                            background_color='white')
    w.generate(txt)
    w.to_file('词云图.png')



if __name__ =='__main__':
    i = 1
    nowPath = os.getcwd()
    while i:
        Output_endTxt(Read_fileName(nowPath))
        Print_picture()
        i = int(input('\n======是否继续?======\n继续请输 1,退出请输 0:'))
        print('===================\n\n')

参考文件:

 致橡树.txt:

我如果爱你——
绝不像攀援的凌霄花,
借你的高枝炫耀自己;
我如果爱你——
绝不学痴情的鸟儿,
为绿荫重复单调的歌曲;
也不止像泉源,
常年送来清凉的慰藉;
也不止像险峰,
增加你的高度,衬托你的威仪。
甚至日光,
甚至春雨。
不,这些都还不够!
我必须是你近旁的一株木棉,
作为树的形象和你站在一起。
根,紧握在地下;
叶,相触在云里。
每一阵风过,
我们都互相致意,
但没有人,
听懂我们的言语。
你有你的铜枝铁干,
像刀,像剑,也像戟;
我有我红硕的花朵,
像沉重的叹息,
又像英勇的火炬。
我们分担寒潮、风雷、霹雳;
我们共享雾霭、流岚、虹霓。
仿佛永远分离,
却又终身相依。
这才是伟大的爱情,
坚贞就在这里:
爱——
不仅爱你伟岸的身躯,
也爱你坚持的位置,
足下的土地

西游记.txt:

东胜神州傲来国海边有一花果山,山顶一石,秉受日月精华,产下一个石猴。石猴在花果山做了众猴之王,为求长生,出海求仙,在西牛贺州拜菩提祖师为师。祖师为其取法名孙悟空,并授与七十二般变化及翻筋斗云之法。孙悟空回到花果山,占山为王,号为美猴王。苦于无兵刃,遂去东海龙宫求取,龙王及兄弟送他一支如意金箍棒及一身披挂。孙悟空又去幽冥界把自己的名字从生死簿上勾掉。龙王,地藏王上天庭告状,太白金星建议招安孙悟空,玉帝准奏。
玉帝封孙悟空做“弼马温”,着他看管马匹。孙悟空后得知此官职卑微,大怒,打出南天门,回花果山,自封为“齐天大圣”。
托塔天王李靖及哪吒三太子奉旨兴师捉拿孙悟空,被孙悟空打败,回天庭复旨。太白金星奏请玉帝降旨封孙悟空为齐天大圣,但不给他事务与俸禄。玉帝准奏。孙悟空应太白金星之请,再入天宫。玉帝封其为齐天大圣,并赐齐天大圣府。孙悟空在天上无事,每日交朋结义,不论尊卑。玉帝怕他闲中生事,让其看管蟠桃园。孙悟空偷吃蟠桃,又搅了王母娘娘的蟠桃盛会,偷吃了太上老君的仙丹,惧祸,回到花果山。
玉帝派天神捉拿孙悟空,双方相持不下。观音菩萨举荐二郎神制伏孙悟空,孙悟空被二郎神擒获。玉帝令天神将其处死,孙悟空却毫发无损。太上老君将其关入八卦炉,孙悟空不但不死,还炼就一双火眼金睛。如来佛祖应玉帝之请,降伏孙悟空,将其压在五行山下,让他饥食铁丸,渴饮铜汁。
如来因南赡部州之人贪淫乐祸,多杀多争,令观音菩萨去东土觅一人,来西天取经,以普渡众生。
唐太宗开科取士,青年陈光蕊高中状元,又娶相府殷小姐为妻。之后,官拜江州州主。陈光蕊携妻赴任,路上,被贼人刘洪谋害,妻子被占。殷氏产下一子,抛入江中,被金山寺寺僧搭救。此子十八年后受戒,法名玄奘。玄奘终与母亲相见,又求见外祖父,报了血仇。
泾河龙王触犯天条,罪当斩首,求唐太宗搭救。太宗允诺,但未能救起。龙王至阴间,告太宗允诺而食言,太宗魂被迫入阴间对质。还生后,太宗修建“水陆大会”,超度阴间所见孤魂。请玄奘主持法事,开经讲法。这时,南海观音亦至长安,寻找取经人,指化玄奘,令其去西天取经。唐太宗认玄奘为御弟,赐号三藏,送出长安。
唐僧西行,出离大唐边界,便遇魔王寅将军,被太白金星搭救。至五行山下,救出孙悟空,赐号孙行者。路上,孙悟空打死六个强盗,不堪唐僧数落,一怒之下去了龙宫。唐僧接受观音赠送的用来钳制孙悟空的两件东西——嵌金花帽与紧箍咒。悟空听从龙王劝告,回到唐僧身边,无意间戴上花帽,却再也摘取不下。唐僧念咒,悟空头痛。自此,悟空受制于唐僧。
二人至鹰愁涧,收了小白龙,小白龙化作白马,供唐僧骑乘。在观音院,悟空卖弄唐僧的锦褊袈裟,金池长老心生贪念,欲火烧唐僧师徒,却被悟空弄法反烧了禅院。袈裟被黑风怪窃走。孙悟空求助观音,设计让观音化作黑风怪的妖友,自己化作仙丹,诱黑风怪吞下,黑风怪降伏。
师徒继续西行,至高老庄,得知庄主女儿被一妖怪强占,悟空擒拿此妖,追至云栈洞。知妖怪原是天庭的天蓬元帅,因调戏嫦娥,被贬下界,错投猪胎,故形貌像猪。经观音收伏,赐名猪悟能,在此等候取经人。孙悟空引他拜见唐僧,唐僧收其为徒,赐号八戒。
过浮屠山,乌巢禅师传授唐僧《多心经》。
过黄风岭遇黄风怪,悟空请来须弥山灵吉菩萨,收伏此怪。
在流沙河,唐僧收被观音点化的沙悟净为三弟子,赐号沙和尚。师徒四人跋山涉水,往西天取经。
观音欲试四人道心,与黎山老母等化成美女,招四人为婿。唐僧等三人不为所动,只有八戒迷恋女色,被菩萨吊在树上。
到万寿山五庄观,悟空等偷吃人参果,并推倒仙树,被拿获。观音应悟空之请,用甘露救活仙树。
白骨精要吃唐僧,悟空三打白骨精。唐僧不识妖怪,听八戒谗言,错逐悟空,自己又被黄袍怪拿住,并被其变为老虎。沙僧亦被捉。八戒经白龙马劝说,到花果山用激将法请悟空救师傅。悟空救出师傅,师徒言归于好。
平顶山莲花洞金角大王、银角大王捉住唐僧欲食其肉,悟空与之斗智斗勇,骗来妖精的五件宝贝,降伏二妖。
狮精把乌鸡国国王推入井中淹死,自己化为国王。真国王鬼魂求唐僧搭救。悟空从太上老君处讨来金丹,救活国王。
牛魔王之子红孩儿据守火云洞,欲吃唐僧。悟空惧其三昧真火,请观音帮忙。观音降伏红孩儿,收其为善财童子。
孙悟空又请西海龙王太子帮助擒获黑水河鼍龙。在车迟国,悟空与三位妖魔国师——虎力鹿力、羊力大仙斗法,妖魔战败,现了原形。
经通天河,遇观音座前莲花池内成精为妖的金鱼,金鱼作法把唐僧摄入水府。观音赶来,收走金鱼。
太上老君的坐骑青牛偷了老君的金刚镯下界为妖,在金兜洞把唐僧捉住。悟空请来天神助战,不能取胜,找到太上老君处,责其收伏青牛。
唐僧、八戒饮子母河水受孕。悟空取来落胎泉水,解了二人胎气。西梁女国王欲强招唐僧为夫婿,悟空等智赚关文,出关西去。
琵琶洞蝎子精摄走唐僧,悟空请来昴日星官,星官化作大公鸡,使妖怪现原形而死。
六耳猕猴变成悟空模样,又令小妖们化成其他三人模样,欲上西天骗取真经。真假悟空大战,众多神佛不能分辨,直到西天雷音寺,如来说出猕猴本相,悟空打死六耳猕猴。
为过火焰山,悟空向铁扇公主借芭蕉扇灭火。铁扇公主恨悟空收伏其子红孩儿,不肯借。悟空与铁扇公主、牛魔王斗智斗勇,借天兵神力,降伏二怪,扑灭大火。
万圣老龙和九头虫驸马盗走祭赛国镇国之宝舍利子。悟空斗败二人,夺回佛宝。
荆棘岭,唐僧被树精、木怪迷惑联句对诗。
弥勒佛前黄眉童子下界作怪,假幻雷音寺,唐僧上当被擒。弥勒佛收伏为怪的童子。
过小西天,悟空打死蛇精。八戒用嘴拱开稀柿衢。
悟空为朱紫国国王治病,败獬豸洞妖怪金毛吼,救回王后。
盘丝洞蜘蛛精缠陷唐僧,悟空打死蜘蛛精。黄花观蜈蚣精又药翻唐僧,紫云山毗蓝婆应悟空之请,消除此怪。
经狮驼山,又有青狮、白象、大鹏作怪,众菩萨罗汉帮助降伏三怪。
比丘国王被寿星坐骑白鹿所化的国丈迷惑,欲用一千一百一十一个小儿心肝做药引,悟空解救婴儿,打退妖怪,寿星赶来收走白鹿怪。
陷空山无底洞老鼠精虏唐僧,欲与之成亲。李天王押走老鼠精。
灭法国王发愿杀一万僧人,悟空施法剃去国王、王后等人头发,国王回心转意,改灭法国为钦法国。
隐雾山连环洞豹子精欲吃唐僧肉,被悟空用瞌睡虫睡倒,八戒将其打死。
凤仙郡大旱,郡侯张榜求雨。悟空劝郡侯向善,天降甘雨。
在玉华州,黄狮精盗走悟空等三人兵器。悟空等夺回兵器,黄狮精投奔九灵元圣,太乙救苦天尊收伏九灵元圣,此怪为天尊坐骑九头狮子所化。
金平府,唐僧被玄英洞妖怪摄去,悟空请天上四位星宿帮忙捉怪,把妖怪斩首示众。
月宫玉兔化为天竺国公主抛绣球给唐僧,欲招之为婿。悟空会合太白星君擒伏玉兔,救回真公主。
镇台府地灵县寇员外家遭劫,员外丧生。唐僧师徒被当作强盗收监,悟空入地府招回寇员外魂,真相大白。
师徒历尽磨难,终至灵山,拜见佛祖如来,因不肯贿赂阿傩、伽叶二尊者,只取得无字经。燃灯古佛指使白雄尊者夺落经卷。四人又返回雷音寺,求有字真经。四人在回东土路上,经通天河,被老鼋连人带经翻人河中,经卷遭水,残缺不全。
佛经送回长安,四人真身重返灵山听封:三奘被封旃檀功德佛;悟空为斗战胜佛;八戒为净坛使者;沙僧为金身罗汉;白龙马为八部天龙,各归本位

虚拟机.txt:

Java虚拟机(JVM)一种用于计算机设备的规范,可用不同的方式(软件或硬件)加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。
Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。
Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。
Java虚拟机规范定义了一个抽象的——而非实际的——机器或处理器。这个规范描述了一个指令集,一组寄存器,一个堆栈,一个“垃圾堆”,和一个方法区。一旦一个Java虚拟机在给定的平台上运行,任何Java程序(编译之后的程序,称作字节码)都能在这个平台上运行。Java虚拟机(JVM)可以以一次一条指令的方式来解释字节码(把它映射到实际的处理器指令),或者字节码也可以由实际处理器中称作just-in-time的编译器进行进一步的编译。
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。
Java虚拟机是Java语言底层实现的基础。这有助于理解Java语言的一些性质,也有助于使用Java语言。对于要在特定平台上实现Java虚拟机的软件人员,Java语言的编译器作者以及要用硬件芯片实现Java虚拟机的人来说,则必须深刻理解Java虚拟机的规范。另外,如果你想扩展Java语言,或是把其它语言编译成Java语言的字节码,你也需要深入地了解Java虚拟机

测试:

 词云图: 

其他文件测试结果如下:

虚拟机.txt:

西游记.txt: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值