# 文件与异常应用实例
# 原题其实是《哈姆雷特》统计英文,但是我没有这个文本资源 # 尝试了一下从网上找,由于我水平有限,没弄到 # 但是有老师提供的笑傲江湖的文本,就用了这个 # 但是处理中文和英文毕竟还是不一样的,我的水平不高,只能按照处理英文的处理了 # 虽然不是怎么对,但是程序也是运行出来了 # 已知该作品《射雕英雄传》对应的 笑傲江湖.txt 文件保存在 E:\Python\Ptest 目录下 # 请编写程序统计 笑傲江湖.txt 中出现频率最高的前10个词,并将结果用文件名“笑傲江湖_词频.txt”保存在同目录下 # 本题除了要求从指定文件获取文本外,其余都和例6-19中的要求一致 # 因此可以参考 例6-19 的代码 def getText(text): text = text.lower() for ch in ",。:!?“” ": text = text.replace(ch,' ') return text def wordFreq(text,topn): word = text.split() a = {} for c in word: a[c] = a.get(c,0) + 1 clear = {'这', '在', '了', '那', '啊','哈','是'} for word in clear: if word in a: print(f"Found '{word}' in text with frequency {a[word]}") del (a[word]) else: print(f"Did not find '{word}' in text") a = list(a.items()) # print(a) a.sort(key = lambda x: x[1],reverse = True) return a[:topn] try: with open(r"E:\Python\Ptest\笑傲江湖.txt",'r',encoding='utf-8') as file: text = file.read() text = getText(text) freqs = wordFreq(text,20) except IOError: print('文件不存在,请确认!\n') else: try: with open(r"E:\Python\Ptest\笑傲江湖_词频.txt",'w') as fileFreq: items = [word + '\t' + str(freq) + '\n' for word,freq in freqs] fileFreq.writelines(items) except IOError: print('写入错误') for word,freq in freqs: print("{:<10}{:>}".format(word,freq))
# 例7-4 # 一年级要举行一个猜谜比赛,需要从儿童谜语集中随机抽题组成5份试卷 # 已知谜语集存储在“E:\Python\Ptest”目录下名为“儿童谜语集csv”的文件中 # 现要求每一份试卷中包含 10 道谜语,请编写程序完成组卷,并生成试卷文件和答卷文件 # 题目要求生成 谜语文件 和 答案文件,考虑到谜面和谜底的一一对应 # 应该用字典将谜语集中,谜面作为键、谜底作为值 # 然后将字典所有的键组成列表,使用shuffle()方法将列表打乱 # 取10个元素组成一张谜语卷,在字典中取其对应的值组成答案卷 # 将思路进一步整理后,可考虑通过以下步骤实现, # ①以读模式打开“儿童谜语集.sv”,将其中的谜面和谜底分别作为键和值生成字典riddles # ②提取字典中的所有键(谜面)生成列表,调用 random 模块的 shuffle()方法将列表打乱 # 提取 10 个元素组成一张谜语卷对应的谜面列表,依次类推共生成5张谜语卷对应的 5 个谜面列表 # 并充当元素组成试卷列表 lsPapers # ③根据 IsPapers 列表,访问字典 riddles,生成 5 张答卷组成的答案卷列表 lsAnswers # ④根据 IsPapers 列表和 lsAnswers 列表创建5个试卷文件 paperl.txt~paper5.txt # 和5个答卷文件answerl.txt~answer5.txt # 为了保证程序的通用性,在编写程序时定义了变量 n 存放要生成的试卷和答卷的 套数 # 同时定义了 # getDic()函数→字典生成 # creatPapers()函数→试卷列表生成 # createFiles()函数→文件创建 import csv import random # 字典生成 def getDic(filename): # 形参是csv文件 with open(filename,'r',encoding='utf-8') as file : dic = {} # 建一个新字典存放迷语和谜底 reader = csv.reader(file) # 读取csv文件内容 next(reader) # 跳过文件的表头 for row in reader: dic[row[0]] = row[1] # 取 谜语 作为键,取 谜底 作为值 return dic # 返回这个字典 # 试卷列表生成 def creatPapers(dic,n): # 形参是 字典 和 要生成n套试卷 items = list(dic.keys()) # 把字典的 键 取出来 生成列表,即 取出 谜语试卷 test = [] # 建一个空列表,用来存放n套不同谜语的试卷 for i in range(n): # 来 n次 不同的随机,把谜语试卷 打乱 random.shuffle(items) ls = items[:10] # 按题目要求 取10道 test.append(ls) # 把出好的谜语试卷 依次 加进 空列表test[] return test # 返回这个总谜语试卷,现在是 n套谜语试卷在一起,即列表套列表 # [ [],[],[],[],[] ] # 文件创建 def createFiles(lsPapers,lsAmswers,n): # 形参是 总谜语试卷列表 和 总答案试卷列表 for i in range(1,n+1): # 遍历 1-n 套试卷 fpn = 'paper' + str(i) + '.txt' # 写谜语文件路径名 with open(fpn,'w',encoding='utf-8') as filep: # 以 只写模式 进入,并直接建立不存在的谜语文件 filep.writelines([item + '\n' for item in lsPapers[i-1]]) # writelines()方法 以列表形式写入 # 用列表生成式 遍历 总谜语试卷列表,取出每套试卷,后面加了换行 # 因为索引是从0开始,所以是i-1 fan = 'answer' + str(i) + '.txt' # 写答案文件路径名 with open(fan,'w',encoding='utf-8') as filea: # 以 只写模式 进入,并直接建立不存在的答案文件 filea.writelines([item + '\n' for item in lsAmswers[i-1]]) # writelines()方法 以列表形式写入 # 用列表生成式 遍历 总答案列表,取出每套答案,后面加了换行 # 因为索引是从0开始,所以是i-1 filen = '儿童谜语集.csv' # 把csv文件路径名赋给变量filen n = 5 # 据题意 设生成5套谜底和对应的答案 riddles = getDic(filen,n) # 调用 将(csv文件 转换为 字典)的函数 getDic(),返回为字典 papers = creatPapers(riddles,n) # 调用 生成 总谜语试卷列表 的函数 creatPapers(),返回为列表 # 下面是生成 n套谜语试卷 的 分别对应的 答案 的总答案列表 answers = [] # 建一个用于存放 总答案 的空列表 for paper in papers: # 在 总谜语试卷列表 遍历,找到每一套谜语试卷 ans = [riddles[item] for item in paper] # 利用了列表生成式,进一步深处遍历,遍历每一套谜语试卷,通过访问字典 取到 每一套谜语试卷所对应答案 answers.append(ans) # 将每一套答案依次放入 总答案列表 createFiles(papers,answers,n) # 最后调用 生成 试卷文件和答案文件 的函数 createFiles()