源码来自mooc 《实用python程序设计》
进行了部分修改,源码按照首字母排序,添加了按词频进行排序
最好源文件和结果文件与countfile文件在同一文件夹下。
不然需要输入绝对路径
使用示例:C:\Users\DELL> python C:\\Users\\DELL\\Desktop\\python_\\countfile.py C:\Users\DELL\Desktop\python_\a1.txt C:\Users\DELL\Desktop\python_\a2.txt
相对路径
'''
本程序用法:
python countfile.py 源文件 结果文件
例如:
python countfile.py a1.txt r1.txt
对 "源文件" 进行单词词频分析,分析结果写入 "结果文件",单词按照字典序排列
'''
import sys
import re
def countFile(filename,words):
#对 filename 文件进行词频分析,分析结果记录在字典中
# 1.打开文件并获取文件内容,要有异常情况的处理(文件不存在或输入文件错误)
try:
f = open(filename,'r',encoding='utf-8')
except Exception as e: # 文件不存在或输入文件名错误捕获异常, 函数返回值为0
print(e)
return 0
txt = f.read() # 获取文件内容
f.close()
# 2.找出文件中所有非字母的字符,添加到分割串集合中
splitChars = set([]) #建立分割串的集合
for c in txt:
if not(c >='a' and c <= 'z' or c >= 'A' and c <= 'Z' ): #统计英文
#if not(c >= '\u4e00' and c <= '\u9fa5'): #统计中文
splitChars.add(c)
# 3.建立正则表达式
# 该正则表达式形式类似于: ,| |:|-之类,分割符之间用 | 间隔
# python字符串大致为 ",|\\.|\\?" 一些特殊字符前要加反斜杠
splitStr = ''
for c in splitChars:
if c in {'.','?','!','"',"'",'(',')','|','*','$','\\','[',']','^','{','}'}:
splitStr += '\\' + c + '|' #python字符串要有两个\\
else:
splitStr += c + '|'
splitStr += " " # '|'后面必须要有东西,空格多写一遍没关系
# 4.获取分割后的单词列表 类似['this','is','a','','jack']
lst = re.split(splitStr,txt)
for x in lst:
if x == '':
continue
lx = x.lower()
if lx in words:
words[lx] += 1 #如果已经在字典中了,则出现次数+1
else:
words[lx] = 1 #如果是第一次出现,则将该词加入字典,出现次数设为1
return 1 #表示正常运行
# 5.程序的运行
result = {} #结果字典。格式为{'a':2,'about':3....}
if countFile(sys.argv[1],result) ==0: # 执行该函数并检查是否正常运行 argv[1]是源文件,分析结果记录在result中
exit()
lst = list(result.items()) # 大致类型[('a',1),('about',2),...]
#lst.sort() #单词按字典序排序
lst.sort(key=lambda x:x[1],reverse=True) #根据词频排序
f = open(sys.argv[2],'w',encoding='utf-8')
for x in lst:
f.write(f"{x[0]} \t {x[1]}\n")
f.close()