Py学习  »  Python

用python如何批量统计word字数

爬虫俱乐部 • 5 年前 • 6453 次点击  

爬虫俱乐部之前推出的线下培训,得到了各位老师的一致好评。为了更加方便大家学习,满足更多Stata用户的学习需求,爬虫俱乐部已隆重推出在线直播课程,请大家奔走相告!课程报名链接:https://ke.qq.com/course/286526#tuin=9735fd2d,详情见推文《爬虫俱乐部隆重推出网上直播课程第一季

有问题,不要怕!点击推文底部“阅读原文”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

喜大普奔~爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~

好消息:爬虫俱乐部即将推出研究助理供需平台,如果您需要招聘研究助理(Research Assistant or Research Associate),可以将您的需求通过我们的公众号发布;如果您想成为一个RA,可以将您的简历发给我们,进入我们的研究助理数据库。帮我们写优质的推文可以提升您被知名教授雇用的胜算呀!

最近小编一直在捣鼓关于python的东西,有一天有人问我,你能不能用python帮我批量地统计一个文件夹下所有word文档的字数呢?这有什么难的,几个函数就能搞定啦。

首先介绍一下接下来会调用的几个的主要用法。

01

docx

由于我们的word文档中的内容以中文为主。可是中文编码的问题总是让人头疼,又是用python读取word中的内容,用open()经常会报错,上网一搜结果发现了Python有专门读取.docx的模块python_docx(只能读取.docx文件,不能读取.doc文件),用起来很方便。值得注意的是,安装这个模块的命令是pip install python_docx,(注意:不是pip install docx)但是在调用的时候只需要直接输入import docx即可。

02

string

String模块包含大量使用常量和类,可以用作字符串操作。在下面的程序中会用到一些命令:string.isdigit表示数字0到9的字符串:’0123456789’;string.ascii_letters表示所有的英文大小写字母;string.punctuation表示所有的标点符号string.isspace表示空白字符‘\t\n\x0b\x0c\r ‘

有了这几个模块之后,我们就可以着手开始写程序啦。我们的具体思路为:1.将word文档的内容导入并保存到list列表中。2.统计每一篇word文档的中文字数,英文字数,空格数,数字个数,标点符号个数。3.获取指定目录下的所有指定后缀的文件名。4.对文件夹内所有的word文档做循环,批量输出结果。

导入所需的模块

import


    
 docx
import
string

1.将word文档读入并保存到para_data这个list中

def read_docx(name):
   file = docx.Document(name)    para_data = []
   for i in range(len(file.paragraphs)):        para_single = file.paragraphs[i].text        para_data.extend(para_single)  
   return para_data

在上面这个函数中,值得注意的是file.paragraphs,它表示的是得到该文档的所有段落,(file.paragraphs是一个列表,列表中的每个元素均为一个自然段的文字),并将每一个段落内的内容赋值给para_single,最后para_data这个列表中得到的是被分割开的一个一个汉字或者英文字母,便于我们在后续的统计,para_data如下图:

2.找出para_data中的中英文、空格、数字、标点符号个数

def str_count(s):
   count_en = count_dg = count_sp = count_zh = count_pu = 0#统一将0赋值给这5个变量
   s_len = len(s)
   for c in s:
   # 统计英文
       if c in string.ascii_letters:            count_en += 1
       # 统计数字
       elif c.isdigit():            count_dg += 1        # 统计空格
       elif c.isspace():            count_sp += 1        # 统计中文
       elif c.isalpha():            count_zh += 1        # 统计特殊字符        else:            count_pu += 1
   total_chars = count_zh + count_en + count_sp + count_dg + count_pu
   if total_chars == s_len:
       return('总字数:{0},中文字数:{1},英文字数:{2},空格:{3},数字数:{4},标点符号:{5}'.format(s_len,count_zh, count_en, count_sp, count_dg, count_pu))

在上面这个函数中,有一个地方值得注意:c in string.ascii_letters表示的是,如果c[a-zA-Z]内,则返回TRUE,否则返回False。

3.获取指定目录下的所有指定后缀的文件名

import os
def getFileName(path):    filename = []    f_list = os.listdir(path)
   for i in f_list:
       if
os.path.splitext(i)[1] == '.docx':            filename.append(i)
   return filename

上面这个函数中值得注意的是os.listdir(path)表示得到该路径下所有的文件名及其扩展名。os.path.splitext,它的作用时分离文件名与扩展名;默认返回(fname,fextension)元组,可做分片操作,得到结果如下:

我们的三个程序写完啦,可是每次都调用三个函数,有点麻烦,所以我们将三个函数整合成一个函数叫word_count

4.将三个函数汇总成一个函数

def word_count(dir):
    for filename in getFileName(dir):
        print(filename, str_count(read_docx(dir+filename)))

我们先通过getFileName 得到某一路径下所有的docx文档名,再对每个文档使用for 循环遍历执行如下操作:首先使用read_docx函数读取该文档下的所有文本内容,以字符串形式返回,再将该字符串送入str_count处理,返回一个格式化字符串,该对象的__call__函数以键值对的形式打印出来自身所附带的所有成员变量。

然后我们在e盘新建一个空的word文档,进行测试。

比如在空的文档中写入:

我aa,,,    11111

这段内容中有一个中文,两个英文,三个标点符号,4个空格,5个数字。

我们可以得到:

接下来就让我们实际操作运行一下吧。比方说我想要得到e盘下所有word文档的信息:

print(word_count('E:/'))

得到:

这就得到最终我们想要的结果了。


注:此推文中的图片及封面(除操作部分的)均来源于网络!如有雷同,纯属巧合!

以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!

应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~


                                   


             文字编辑:赵宇亮

  技术总编:刘贝贝


往期推文推荐:

1.爬虫俱乐部新版块--和我们一起学习Python

2.hello,MySQL--Stata连接MySQL数据库

3.hello,MySQL--odbcload读取MySQL数据

4.再爬俱乐部网站,推文目录大放送!

5.用Stata生成二维码—我的心思你来扫

6.Hello,MySQL-odbc exec查询与更新

7.Python第一天

8.Python第二天

9.事件研究大放送

10.爬虫俱乐部隆重推出网上直播课程第一季





关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/yjUKykm59T
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/12048
 
6453 次点击