要求
对HarryPotter5.txt英文小说进行词频统计,统计出前二十个频率最高的单词,并打印输出或写入文件
一、打开文件
打开文件并将单词中非单词字符用空格代替
代码:
#读取小说内容
fp = open('HarryPotter5.txt')
content = fp.read()
#所有标点符号 用空格代替
#匹配非单词字符的字符
content = re.sub('\W',' ',content)
# Python split() 通过指定分隔符对字符串进行切片
words = content.split() # 以空格为分隔符,包含 \n
正则表达式
\W
__匹配非单词字符的字符。_这与 \w 正相反。如果使用了 ASCII 旗标,这就等价于 [^a-zA-Z0-9]。如果使用了 LOCALE 旗标,则会匹配当前区域中既非字母数字也非下划线的字符。
spilt()函数
Python split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
str.split(str="", num=string.count(str)).
str – 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
num – 分割次数。默认为 -1, 即分隔所有
实例
str = "Line1-abcdef \nLine2-abc \nLine4-abcd";
print str.split( ); # 以空格为分隔符,包含 \n
print str.split(' ', 1 ); # 以空格为分隔符,分隔成两个
以上实例输出结果如下:
[‘Line1-abcdef’, ‘Line2-abc’, ‘Line4-abcd’]
[‘Line1-abcdef’, ‘\nLine2-abc \nLine4-abcd’]
以下实例以 # 号为分隔符,指定第二个参数为 1,返回两个参数列表。
txt = "Google#Runoob#Taobao#Facebook"
# 第二个参数为 1,返回两个参数列表
x = txt.split("#", 1)
print x
以上实例输出结果如下:
[‘Google’, ‘Runoob#Taobao#Facebook’]
二、词频统计
代码如下(示例):
#对所有的单词出现次数进行统计
#key-->count 数据结构:Dict字典
wordCounter = {
}
for word in words:
if word in wordCounter:
wordCounter[word] += 1
else:
wordCounter[word] = 1
#print(wordCounter)
#这样打印输出是乱序 需要进行排序 sorted
三、单词排序
代码如下(示例):
#默认按照增序 使用reverse参数改变顺序
sortedWordCounter = sorted(wordCounter.items(),key=lambda item: item[1],reverse=True)
#print(sortedWordCounter) #这是打印排序完毕的词频
Dict字典底层是哈希结构 哈希结构不支持排序
wordCounter.items()装换成-----列表
这个列表中每一个元素是一个元组
元组里有两个元素 第一个元素是键 第二个元素是值
效果如下:
解释 lambda item: item[1]:
相当于定义一个函数 lambda 相当于匿名函数
效果如下
lambda item: item[1] :前是参数 :后是返回值
def func(item):
return item[1]
匿名函数和正常函数效果一样只不过是没有名字而已
四、输出或写入文件
代码如下(示例):
#方法一
print(sortedWordCounter[:20])
#方法二
for item in sortedWordCounter[:20]:
print(item)
#也可以写入文件
fp = open('countwords_result.csv','w')
for (word,count) in sortedWordCounter:
line = word+','+str(count)+'\n'
fp.write(line)
python文件写入
写入已有文件
如需写入已有的文件,必须向 open() 函数添加参数:
“a” - 追加 - 会追加到文件的末尾
“w” - 写入 - 会覆盖任何已有的内容
注释:“w” 方法会覆盖全部内容。
#打开文件 "demofile2.txt" 并将内容追加到文件中:
f = open("demofile2.txt", "a")
f.write("Now the file has more content!")
f.close()
# 追加后,打开并读取该文件:
f = open("demofile2.txt", "r")
print(f.read())
#打开文件 "demofile3.txt" 并覆盖内容:
f = open("demofile3.txt", "w")
f.write("Woops! I have deleted the content!")
f.close()
# 写入后,打开并读取该文件:
f = open("demofile3.txt", "r")
print(f.read())
如需在 Python 中创建新文件,请使用 open() 方法,并使用以下参数之一:
“x” - 创建 - 将创建一个文件,如果文件存在则返回错误
“a” - 追加 - 如果指定的文件不存在,将创建一个文件
“w” - 写入 - 如果指定的文件不存在,将创建一个文件
#创建名为 "myfile.txt" 的文件:
f = open("myfile.txt", "x")
#结果:已创建新的空文件!
#如果不存在,则创建新文件:
f = open("myfile.txt", "w")