python-统计文本行,大写字母开头行,最多最少字符行,单词总数

直接上代码,解释在注释,不懂评论留言,必回

'''
2.用windows“记事本”创建一个文本文件,期中每行包含一段英文。
试读出文件的全部内容,并判断:
(1)该文本文件有多少行?
(2)文件中以大写字母开头的有多少行?
(3)包含字符最多和最少的分别在第几行?
(4)改文本一共有多少个单词
(hamlet.txt  
统计结果如下:
本文行数: 5593
空行数: 211
以大写字母开头的行数: 4737
包含字符数最多行是: 2706
包含字符数最少行是: 18
全文单词总数是: 32711
)
'''
'''
读取文件
f.read() 一次读取所有数据,返回一个字符串 如果文本大小超过20G,会卡死
f.readline() 一次读取一行数据  返回一行的数据,字符串类型
f.readlines() 一次读取所有数据  返回一个列表类型,每行数据(sin)放入一个列表list
'''

'''
字符判定方式
字符串.isalnum()  所有字符都是数字或者字母,为真返回 Ture,否则返回 False。

字符串.isalpha()   所有字符都是字母,为真返回 Ture,否则返回 False。

字符串.isdigit()     所有字符都是数字,为真返回 Ture,否则返回 False。

字符串.islower()    所有字符都是小写,为真返回 Ture,否则返回 False。

字符串.isupper()   所有字符都是大写,为真返回 Ture,否则返回 False。

字符串.istitle()      所有单词都是首字母大写,为真返回 Ture,否则返回 False。

字符串.isspace()   所有字符都是空白字符,为真返回 Ture,否则返回 False。
'''

'''
re.sub用法
sub(pattern,repl,string)	把字符串中的所有匹配表达式pattern中的地方替换成repl
[^**]	                        表示不匹配此字符集中的任何一个字符
'''

import re

#根据自己的需求,更改文件路径
fpath = 'C:/Users/Lenovo/Desktop/hamlet.txt'
with open(fpath,'r') as f:
    emptylines = 0  #统计空行数
    countlines = 0  #统计全文行数
    upperlines = 0  #统计大写字母开头的行数
    maxchar = -0x3f3f3f3f    #统计当前行字符数量的个数
    minchar = 0x3f3f3f3f     #统计当前行字符数量的个数
    maxline = 0             #记录当前字符数量个数最多的
    minline = 0             #统计大写字母开头的行数
    wordssum = 0    #单词总数
    for contents in  f :
        contents = contents.strip()     #去掉前后空格
        contents = contents.split("\n") #用split根据换行分割 返回list
        countlines+=1
        #一定要注意,返回的contens是一个list,只是list里面的内容为str而已
        #如果用if contents ==""将不会通过if条件
        if contents == [""]:        
            emptylines+=1
        #print(contents)    #这种方式输出的是列表类型
        #content =' '.join(contents)   #list 转化 str
        #print(type(contents))       #返回的contents是list类型 
        #print(contents[0])          #读取list中的字符串
        #print(type(contents[0]))    #返回的是str类型
        #print(contents[0][0])       #返回每一行的首字母
        #这里有一个坑,因为文件有空行,所以contents[0]有为空的情况
        #当为空时,使用contents[0][0]读取首字母,就会报错,因为为空
        #所以加一个判定即可
        #我们读取了一个每行的首字母,就可以判定本行是不是大写字母开头的
        if contents[0]:
           if contents[0][0].isupper():
               upperlines+=1
        #计算字符最多的行和字符最少的行
        if contents[0]:       
            temp = len(contents[0])     #统计当前字符串字符的个数
            if temp > maxchar:
                maxchar = temp
                maxline = countlines
            if temp < minchar:
                minchar = temp
                minline = countlines
        if contents[0]:
           #处理掉字符串中的非单词的字符,用空格代替
           #处理的单词,to-night要为一个单词
           #因为--可能为说明,所以如果直接正则匹配-的话肯定不行的
           #所以正则匹配之前先把--字符替换掉
           word =contents[0].replace("--"," ")
           words = re.sub("[^\u0041-\u005a\u0061-\u007a-]" ," ",word)
           words = words.split()
           #print(words)
           #按照空格分隔单词
           wordssum+=len(words)
    print("本文行数:",countlines)
    print("空行数:",emptylines)
    print("以大写字母开头的行数:",upperlines)
    print("包含字符数最多行是:",maxline)
    print("包含字符数最少行是:",minline)
    print("全文单词总数是:",wordssum)

补充内容

常用unicode编码范围,用于正则匹配
\u4e00 - \u9fa 汉字的unicode范围
\u0030 - \u0039 数字的unicode范围
\u0041 - \u005a 大写字母unicode范围
\u0061 - \u007a 小写字母unicode范围

猜你喜欢

转载自blog.csdn.net/weixin_43402353/article/details/109144763