Python.第七章 文件与异常 应用实例

本文介绍了如何使用Python编写程序,从指定的《笑傲江湖》文本文件中统计出现频率最高的前10个词,并将结果保存到另一个文件中。程序包括文本预处理、词频计算和文件操作的部分。
摘要由CSDN通过智能技术生成
# 文件与异常应用实例
# 原题其实是《哈姆雷特》统计英文,但是我没有这个文本资源
# 尝试了一下从网上找,由于我水平有限,没弄到
# 但是有老师提供的笑傲江湖的文本,就用了这个
# 但是处理中文和英文毕竟还是不一样的,我的水平不高,只能按照处理英文的处理了
# 虽然不是怎么对,但是程序也是运行出来了


# 已知该作品《射雕英雄传》对应的 笑傲江湖.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()

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值