统计一个文本的字符、单词数

文本操作是最常见的,以例子的形式来驱动程序的编写

例一:统计一篇文章或计算机文件里的字符或单词数

#-*-encoding:utf-8-*-
import time

keep = {'a','b','c','d','e','f','g','h','i','j','k',
     'l','m','n','o','p','q','r','s','t','u','v',
     'w','x','y','z',' ','-',"'"}


def normalize(s):
#大写转换成小写,并且剔除数字等开头或不在列表中的字符,返回正常字符串
    result = ''
    for c in s.lower():
        if c in keep:
            result +=c
    return result    
    
def make_freq_dict(s):
    #计算频率次数,将字符串转化成次数字典
    s = normalize(s)
    words = s.split()
    d = {}
    for w in words: 
        if w in d:
            d[w] +=1
        else:
            d[w] = 1
            
    return d
        
def print_file_stats(fname):
    s = open(fname,'r').read()
    num_chars = len(s)
    num_lines = s.count('\n')
    d = make_freq_dict(s) #一层一层往上调用函数
    num_words = sum(d[w] for w in d)
    lst = [(d[w],w) for w in d]
    lst.sort()
    lst.reverse()
    print("The file '%s' has: " % fname)
    print(" %s characters " % num_chars)
    print(" %s lines " % num_lines)
    print(" %s words" % num_words)
    print("\nThe top 10 most frequent words are:")
    i=1
    for count,word in lst[:10]:#将字典转换成元组
        print('%2s. %4s个  %s' % (i,count,word))
        i +=1
  
def main():
    start = time.time()      
    print_file_stats('bill.txt')
    end = time.time()
    use = end - start
    print('一共花了%s 秒的时间' % use)
if __name__=='__main__':
    main()

以上为未使用正则表达式的版本

例二:针对之前写的C语言版本,统计单词数

#include "stdio.h"  
int count_word(char *str); 
void main()
{ 
   char str1[80];
   int sum=0;  
   puts("please enter a string");
   gets(str1); 
   sum=count_word(str1); //返回的count就是sum 
   printf("there are %d words in this sentence",sum);
 } 
  int count_word(char *str)
 { 
    int count,flag; 
    char *p; 
    count=0;
     flag=0; 
     p=str; 
      while(*p!='\0')/*当字符串没有到结尾的时候,重头到尾的循环*/
       { 
        if(*p==' ')/*假如字符串遇到空格,就将flag清零,同时可以过滤掉多余的空格*/ 
        flag=0; 
        else if(flag==0)/*当字符串不是空格时,假如flag为0,那么计算器加1,既是遇到空格后的第一个字符时*/
         { 
          flag=1;/*将flag标记回1,这样在遇到第一个字符后的字符时可以将他过滤掉,直到遇到空格时,在清零*/ 
          count++; //count就是统计单词数的变量。其实就是单词数的第一个字符,后面的字符都没有统计了 
          }
      p++; // 这里是抛开上面的flag=0,继续加一。没有遇到空格的时候 。直到继续遇到空格或结尾的时候,才不加一了。 
         } 
     return count;
 }
     

 

posted @ 2015-03-26 13:27  kin2321  阅读(358)  评论(0编辑  收藏  举报