文件和数据格式化-课后作业
一、单项选择题
1、文件句柄f,以下是f.seek(0)作用的是:
-
A 将指针返回文件开始
-
B 将指针跳转到文件最后
-
C 寻找文件中第一个值为0的位置
-
D 保持文件指针不动
【答案】A
【解析】暂无解析
2、给出如下代码:
fname=input("请输入要打开的文件:")
fi open(fname,"r")
for line in fi.readlines():
print(line)
fi.close()
以下选项中描述错误的是
-
A 上述代码中fi.readlines()可以优化为fi
-
B 通过fi.readlines()方法将文件的全部内容读入一个列表fi
-
C 通过fi.readlines()方法将文件的全部内容读入一个字典fi
-
D 用户输入文件路径,以文本文件方式读入文件内容并逐行打印
【答案】C
【解析】暂无解析
3、关于数据组织的维度,以下选项中描述错误的是
-
A 二维数据采用表格方式组织,对应于数学中的矩阵
-
B 一维数据采用线性方式组织,对应于数学中的数组和集合等概念
-
C 数据组织存在维度,字典类型用于表示一维和二维数据
-
D 高维数据由键值对类型的数据构成,采用对象方式组织
【答案】C
【解析】暂无解析
4、关于Python文件打开模式的描述,以下选项中错误的是
-
A 创建写模式n
-
B 追加写模式a
-
C 只读模式r
-
D 覆盖写模式w
【答案】A
【解析】暂无解析
5、执行如下代码:
fname=input("请输入要写入的文件:")
fo open(fname,"w+")
1s=["清明时节雨纷纷,","路上行人欲断魂,","借问酒家何处有?","牧童遥指杏花村。"]
fo.writelines(1s)
fo.seek(g)】
for line in fo:
print(line)
fo.close()
以下选项中描述错误的是
-
A fo.seek(0)这行代码可以省略,不影响输出效果
-
B 代码主要功能为向文件写入一个列表类型,并打印输出结果
-
C 执行代码时,从键盘输入“清明.txt”,则清明.txt被创建
-
D fo.writelines(ls)将元素全为字符串的ls列表写入文件
【答案】A
【解析】暂无解析
6、关于Python文件的 ‘+’ 打开模式,以下选项中描述正确的是
-
A 与r/w/a/x一同使用,在原功能基础上增加同时读写功能
-
B 追加写模式
-
C 覆盖写模式
-
D 只读模式
【答案】A
【解析】暂无解析
二、程序设计题
1、词频统计
类型:文件
描述
《谁动了我的奶酪?》是美国作家斯宾塞·约翰逊创作的一个寓言故事,该书首次出版于1998年。书中主要讲述4个“人物”—两只小老鼠“嗅嗅(Sniff)”、“匆匆(Scurry)”和两个小矮人“哼哼(Hem)”、“唧唧(Haw)”找寻奶酪的故事。
文件“Who Moved My Cheese.txt”中包含这个故事的中英文,格式如下:
请按照函数的注释,补充程序中缺失部分语句,按要求实现如下程序功能:
read_file()函数将文件中的内容读为字符串,过滤掉中文,只保留文件中的英文字母和西文符号(只保留ASCII码字符)。所有字符转为小写,将其中所有标点、符号替换为空格。
count_of_words()函数统计read_file()函数返回的字符串中的单词数量和不重复的单词数量。
top_ten_words()函数分行依次输出出现次数最多的n个单词及其出现次数。
word_frequency()函数统计并以字典类型返回每个单词出现的次数。
top_ten_words_no_excludes()函数统计并输出去除常见的冠词、代词、系动词和连接词后,出现次数最多的 cnt个单词及其出现次数。
根据用户输入的指令和任务完成程序:
若输入指令为“1”,则在下一行中输入一个非负整数n,并输出read_file()函数返回值的前n个字符。 若输入指令为“2”,并调用count_of_words()函数统计输出read_file()函数返回的字符串中的单词数量和不重复的单词数量,格式参考下面的输入输出示例,其中的XXXX需用统计出的实际数值替换。 若输入指令为“3”,则在下一行中输入一个正整数n,并调用top_ten_words()函数分行依次输出出现次数最多的n个单词及其出现次数,单词和次数之间以空格间隔。 若输入指令为“4”,则在下一行中输入一个非负整数n,并调用top_ten_words_no_excludes()函数从词频统计结果中去除常见的冠词、代词、系动词和连接词后统计词频,再输出出现次数最多的n个单词及其出现次数,单词和次数之间以空格间隔。需排除的单词包括:[‘a’, ‘an’, ‘the’, ‘i’, ‘he’, ‘she’, ‘his’, ‘my’, ‘we’,‘or’, ‘is’, ‘was’, ‘do’, and’, ‘at’, ‘to’, ‘of’, ‘it’, ‘on’, ‘that’, ‘her’, ‘c’,‘in’, ‘you’, ‘had’, ‘s’, ‘with’, ‘for’, ‘t’, ‘but’, ‘as’, ‘not’, ‘they’, ‘be’, ‘were’, ‘so’, ‘our’, ‘all’, ‘would’, ‘if’, ‘him’, ‘from’, ‘no’, ‘me’, ‘could’, ‘when’, ‘there’, ‘them’, ‘about’, ‘this’, ‘their’, ‘up’, ‘been’, ‘by’, ‘out’, ‘did’, ‘have’]
参考资料:
【ASCII 码表】
0000-007F(0-127):C0控制符及基本拉丁文 (C0 Control and Basic Latin) 0080-00FF(128-255):C1控制符及拉丁文补充-1 (C1 Control and Latin 1 Supplement)
示例 1
输入:
1
50
输出:
chapter 1
once long ago in a land far away there
示例 2
输入:
2
输出:
文章共有单词XXXX个,其中不重复单词XXXX个
示例 3
输入:
3
5
输出:
the 369
he 337
to 333
and 312
cheese 214
示例 4
输入:
4
5
输出:
cheese 214
haw 113
what 105
change 86
hem 83
代码:
# -*- coding = utf-8 -*-
# @Author:为一道彩虹
import string
def read_file(file):
"""接收文件名为参数,将文件中的内容读为字符串,
只保留文件中的英文字母和西文符号,
过滤掉中文(中文字符及全角符号Unicode编码都大于256)
将所有字符转为小写,
将其中所有标点、符号替换为空格,返回字符串
"""
with open(file, 'r', encoding='utf-8') as f:
txt = f.read()
s=''
for c in txt:
if ord(c)>256:
s=s+''
elif c in string.punctuation:
s=s+' '
else:
s=s+c
return s.lower()
def count_of_words(txt):
"""接收去除标点、符号的字符串,统计并返回其中单词数量和不重复的单词数量"""
ls=txt.split()
return len(ls),len(set(ls))
def word_frequency(txt):
"""接收去除标点、符号的字符串,统计并返回每个单词出现的次数
返回值为字典类型,单词为键,对应出现的次数为值"""
ls=txt.split()
dic={k:ls.count(k) for k in set(ls)}
return dic
def top_ten_words(frequency, cnt):
"""接收词频字典,输出出现次数最多的cnt个单词及其出现次数"""
ls = sorted(frequency.items(), key=lambda x: x[1], reverse=True)
for word, counts in ls[:cnt]:
print(word, counts)
def top_ten_words_no_excludes(frequency, cnt):
"""接收词频字典,去除常见的冠词、代词、系动词和连接词后,输出出现次数最多的
cnt个单词及其出现次数,需排除的单词如下:
excludes_words = ['a', 'an', 'the', 'i', 'he', 'she', 'his', 'my', 'we',
'or', 'is', 'was', 'do', 'and', 'at', 'to', 'of', 'it', 'on', 'that', 'her',
'c','in', 'you', 'had','s', 'with', 'for', 't', 'but', 'as', 'not', 'they',
'be', 'were', 'so', 'our','all', 'would', 'if', 'him', 'from', 'no', 'me',
'could', 'when', 'there','them', 'about', 'this', 'their', 'up', 'been',
'by', 'out', 'did', 'have']
"""
excludes_words = ['a', 'an', 'the', 'i', 'he', 'she', 'his', 'my', 'we',
'or', 'is', 'was', 'do', 'and', 'at', 'to', 'of', 'it', 'on', 'that', 'her',
'c','in', 'you', 'had','s', 'with', 'for', 't', 'but', 'as', 'not', 'they',
'be', 'were', 'so', 'our','all', 'would', 'if', 'him', 'from', 'no', 'me',
'could', 'when', 'there','them', 'about', 'this', 'their', 'up', 'been',
'by', 'out', 'did', 'have']
for k in excludes_words:
frequency.pop(k)
ls = sorted(frequency.items(), key=lambda x: x[1], reverse=True)
for word, counts in ls[:cnt]:
print(word, counts)
# 取消这段和代码最后二行注释可以绘制词云,仅供参考
# def draw_cloud(frequency):
# """绘制词云,传入参数为词频,设定图片的宽度600,高度400,背景白色、字体最大值150、图片边缘为5。"""
# wc = WordCloud(max_words=80, # 设置显示高频单词数量
# width=600, # 设置图片的宽度
# height=400, # 设置图片的高度
# background_color='White', # 设置背景颜色
# max_font_size=150, # 设置字体最大值
# margin=5, # 设置图片的边缘
# scale=1.5) # 按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍。
# wc.generate_from_frequencies(frequency) # 根据文本内容直接生成词云
# plt.imshow(wc) # 负责对图像进行处理,并显示其格式,但是不能显示。
# plt.axis("off") # 不显示坐标轴
# wc.to_file('My Cheese.png') # 词云保存为图片
# plt.show() # 显示图像
if __name__ == '__main__':
filename = 'Who Moved My Cheese.txt' # 文件名
content = read_file(filename) # 调用函数返回字典类型的数据
frequency_result = word_frequency(content) # 统计词频
cmd = input()
if cmd == '1':
n = int(input())
print(content[:n])
elif cmd == '2':
amount_results = count_of_words(content)
print('文章共有单词{}个,其中不重复单词{}个'.format(*amount_results))
elif cmd == '3':
n = int(input())
top_ten_words(frequency_result, n)
elif cmd == '4':
n = int(input())
top_ten_words_no_excludes(frequency_result, n)
# frequency_no_excludes = top_ten_words_no_excludes(frequency_result)
# draw_cloud(frequency_no_excludes)
2、传感器日志光照统计
类型:Python 文件
本题目附件提供了一个传感器日志文件,为文本类型,共 1 千行,每行包含了日期、时间和 4 种传感器读数值。
其中,4 种传感器读数值分别是:温度、湿度、光照和电压。
在 Python123 中读取文件请假设题目对应文件在当前目录下,文件打开函数参考如下:
f=open("sensor-data-1k.txt", "r")
编写程序,统计日志反应的光照平均值,保留小数点后 2 位。
**示例1:**
输入:无
输出:"43.24"
注意:示例1 是一个输入输出示范样例,不是正确结果。
代码:
# -*- coding = utf-8 -*-
# @Author:为一道彩虹
if __name__ == '__main__':
# 以只读模式打开文件 "sensor-data-1k.txt"
with open("sensor-data-1k.txt", "r") as f:
# 初始化求和与计数变量
sum, cnt = 0, 0
# 遍历文件中的每一行
for line in f:
# 将每行拆分为字符串列表
ls = line.split()
# 增加行数计数
cnt += 1
# 将第五个元素的数值加到求和中
sum += eval(ls[4])
# 打印平均值,保留两位小数
print(f"{sum / cnt:.2f}")
3、传感器采集数据
类型:Python 文件
下面是一个传感器采集数据文件 sensor-data.txt 的一部分:
2018-02-28 01:03:16 19.3024 38.4629 45.08 2.68742
2018-02-28 01:06:16 19.1652 38.8039 46.08 2.68742
2018-02-28 01:06:46 19.175 38.8379 47.08 2.69964
……
其中,每行是一个读数,空格分隔多个含义,分别包括日期、时间、温度、湿度、光照和电压。其中,光照处于第 5 列。 请编写程序,统计并输出传感器采集数据中光照部分的最大值、最小值和平均值,所有值保留小数点后 2 位。
**示例1:**
输入:无
输出:"最大值、最小值、平均值分别是:49.08,40.08,44.37"
代码:
# -*- coding = utf-8 -*-
# @Author:为一道彩虹
if __name__ == '__main__':
fp = open("sensor-data.txt", "r") # 读取文件
l = [] # 创建列表保存光照值
s = fp.readline()
while s:
l.append(float(list(s.split())[4]))
s = fp.readline()
print("最大值、最小值、平均值分别是:%.2f,%.2f,%.2f" % (max(l), min(l), sum(l) / len(l)))
fp.close()
4、十二星座
类型:Python 文件
古代航海人为了方便在航海时辨别方位和观测天象,将散布在天上的星星运用想象力将它们连接起来,有一半是在古时候已命名,另一半是近代开始命名的。两千多年前古希腊的天文学家希巴克斯命名十二星座,依次为白羊座、金牛座、双子座、巨蟹座、狮子座、处女座、天秤座、天蝎座、射手座、魔蝎座、水瓶座和双鱼座。给出二维数据存储 CSV 文件(SunSign.csv),内容如下:
星座,开始月日,结束月日,Unicode
水瓶座,120,218,9810
双鱼座,219,320,9811
白羊座,321,419,9800
金牛座,420,520,9801
双子座,521,621,9802
巨蟹座,622,722,9803
狮子座,723,822,9804
处女座,823,922,9805
天秤座,923,1023,9806
天蝎座,1024,1122,9807
射手座,1123,1221,9808
魔蝎座,1222,119,9809
请编写程序,读入 CSV 文件中数据,循环获得用户输入,直至用户输入 “exit
” 退出。根据用户输入的星座名称,输出此星座的出生日期范围及对应字符形式。如果输入的星座名称有误,请输出“输入星座名称有误!
”。
**示例1:**
输入:"
白羊座
金牛座
双子座
exit
"
输出:"
♈座的生日位于321-419之间
♉座的生日位于420-520之间
♊座的生日位于521-621之间
"
**示例2:**
输入:"
天猫座
exit
"
输出:"输入星座名称有误!"
**注意:**
- 输入使用 input(),不要增加额外的提示信息;
- 从附件中读取 utf-8 编码文本数据。
代码:
# -*- coding = utf-8 -*-
# @Author:为一道彩虹
if __name__ == '__main__':
# 打开 "SunSign.csv" 文件,指定编码为 UTF-8
f = open("SunSign.csv", encoding="utf-8")
# 创建一个空字典用于存储星座和对应生日范围
dic = {}
# 遍历文件中的每一行
for line in f.readlines():
# 将每行按逗号分割成列表
li = line.split(",")
# 将星座名称作为字典的键,生日范围作为值,存储到字典中
dic[li[0]] = li[1:]
# 用户输入星座名称
xz = input()
# 进入循环,直到用户输入 "exit" 为止
while True:
# 如果用户输入 "exit",则跳出循环
if xz == "exit":
break
else:
# 获取用户输入的星座对应的生日范围
s = dic.get(xz, 0)
# 如果输入的星座名称不存在,则提示用户输入有误
if s == 0:
print("输入星座名称有误!")
else:
# 打印输出星座的生日范围,使用 chr(eval(s[2])) 将 ASCII 码转换为对应字符
print("{}座的生日位于{}-{}之间".format(chr(eval(s[2])), s[0], s[1]))
# 继续接受用户输入星座名称
xz = input()
先赞后看,养成习惯!!!^ _ ^ ❤️ ❤️ ❤️
码字不易,大家的支持就是我的坚持下去的动力。点赞后不要忘了关注我哦!