文章目录
- 前言
- 一、核心问题
- 1.文件的打开和关闭
- 1)open和close实现
- 2)with实现
- 2.遍历文本
- 二、额外要求---过滤信息
- 1.不统计特定字符
- 1)用repalce替换为空
- 2)用del删除
- 3)re正则表达式
- 2.不统计所有标点
- 1)string.punctuation
- 2)[re正则表达式](https://www.bilibili.com/video/BV1kp4y1C7c8)
- 3)调用zhon包的zhon.hanzi.punctuation函数
- 3.去除重复的字符
- 4.去除空行
- 5.只记录特点字符之间的信息
- 1)多种特定字符轮流出现,取其中部分字符间的信息
- 2)取固定字段间的信息
- 三、额外要求---统计
- 1.计数
- 2.对统计结果进行排序
- 四、其他
- 1.输入获取内容后返回输入状态
- 2.多次遍历文件时关于读取指针seek()的坑
前言
python二级考试题里面文本统计出现的比较多,而且会有很多种变化,主要是一些细微末节的要求。
提示:以下是本篇文章正文内容,下面案例可供参考
一、核心问题
1.文件的打开和关闭
1)open和close实现
2)with实现
with open('1.txt') as f1, open('2.txt') as f2:
do something
2.遍历文本
1)主要是用read、readline、readlines函数配合循环结构。 例1:readlines
fo = open("PY301-SunSign.csv", 'r',encoding='UTF-8')
ls = []
for line in fo.readlines():
ls.append(line.replace("\n", '')
这样就通过遍历获取了每行内容并去掉末尾的换行符。
2)while与readline可配合海象表达式来遍历文本
二、额外要求—过滤信息
1.不统计特定字符
1)用repalce替换为空
2)用del删除
3)re正则表达式
①[]配合ˆ进行取反操作
如果集合首字符是 ‘^’ ,所有 不 在集合内的字符将会被匹配,比如 [ˆ5] 将匹配所有字符,除了 ‘5’, [^^] 将匹配所有字符,除了 ‘^’。 ^ 如果不在集合首位,就没有特殊含义。
②re.sub(pattern, repl, string, count=0, flags=0)进行替换,和replace差不多
2.不统计所有标点
1)string.punctuation
针对英文文本
2)re正则表达式
①对于中文文本re.findall(u’[\u4e00-\u9fff]+’, string, flags=0)参见Unicode Character Ranges
3)调用zhon包的zhon.hanzi.punctuation函数
该方法针对中文文本
3.去除重复的字符
使用set函数转换为集合,实现元素去重
4.去除空行
可用条件语句组合strip()函数因为strip函数对空行使用会得到空值,其布尔值为False。
5.只记录特点字符之间的信息
1)多种特定字符轮流出现,取其中部分字符间的信息
可以用逻辑运算符之与或非进行较为复杂的条件设置同时增加哨兵变量。
例题如下:
现有文本“论语”如下:
【原文】
子曰(1):“学(2)而时习(3)之,不亦说(4)乎?有朋(5)自远方来,不亦乐(6)乎?人不知(7),而不愠(8),不亦君子(9)乎?”
【注释】
(1)子:中国古代对于有地位、有学问的男子的尊称,有时也泛称男子。《论语》书中“子曰”的子,都是指孔子而言。
具体要求:仅保留“论语.txt”文件中所有【原文】标签下面的内容,不保留标签,并去掉每行行首空格及行尾空格,无空行。原文小括号及内部数字是源文件中注释项的标记,请保留。
fi = open("论语.txt", "r")
fo = open("论语-原文.txt", "w")
a=0
for line in fi:
if a==1 and line.count("【注释】")==0 and line.count("【原文】")==0:
line = line.strip(" \n")
if line.strip():#判断line是否为空串
fo.write('{}\n'.format(line))
if line.count("【原文】")>0:
a=1
if line.count("【注释】")>0:
a=0
fi.close()
fo.close()
2)取固定字段间的信息
如要取得类似alt="河南科技大学" width="164"
的所有字符串中大学的名称。可用正则表达式。
import re
re.findall('alt="(.*)" width=',i))
三、额外要求—统计
1.计数
主要应用字典及其get方法结合循环方法实现,中文词汇的话还要用到jieba库
例:MOOC北京理工大学的嵩天老Python中的例子便是这样实现的
2.对统计结果进行排序
假设我们已经求得了包含统计结果的字典counts(counts是一个类似{‘天’: 2220, ‘龙’: 216…}结构的字典)。若我们要的是排好序的前5名。
代码如下:
items=list(counts.items())
items.sort(key=lambda x:x[1],reverse=True)#reverse = True 降序, reverse = False 升序(默认)。
for i in range(5):
word,count=items[i]#元组的‘多变量同步赋值’
print('{0}:{1}'.format(word,count))
WARNING⚠️:
- counts.items所获数据类为’dict_items’,不同于‘list’。不能用sort方法
sort方法需要用到参数key,也就是关键词,lambda是一个隐函数,是固定写法,不要写成别的单词;x表示列表中的一个元素,在这里,表示一个元组,x只是临时起的一个名字,你可以使用任意的名字;x[0]表示元组里的第一个元素,当然第二个元素就是x[1];所以这句命令的意思就是按照列表中第一个元素排序
四、其他
1.输入获取内容后返回输入状态
如下代码,利用while循环,利用条件永远为真,在操作最后完后再次加上input,实现操作结束后回到输入状态。
sall = input('请输入:')
while sall != '':
sall = input('请输入:')
2.多次遍历文件时关于读取指针seek()的坑
有时候需要多次遍历文件,但会发现只有一次结果,那是因为没有调整指针的位置,而使后来读取的部分都为空。
以上只是部分常见要求和处理办法,以后遇见了其他种类再慢慢更新吧。