目录
第1关 读文件全部内容到一个字符串
任务描述
本关任务:编写一个能读文件全部内容到一个字符串的小程序。
相关知识
为了完成本关任务,你需要掌握: 1.文件的打开 2.读文件到字符串
file = '/data/bigfiles/出塞.txt'
with open(file, mode='r', encoding='utf-8') as f: # 为文件对象命的名放在as后面
txt = f.read() # 将文件全部内容读入到字符串txt中
print(txt)
第2关 读文件前n个字符
任务描述
本关任务:编写一个能读文件前n个字符的小程序。
相关知识
为了完成本关任务,你需要掌握: 1.读文件到字符串
读文件到字符串
2.read(size) 当参数size为大于或等于0的整数时,读取size个字符
n = int(input())
file = '/data/bigfiles/出塞.txt'
with open(file, mode='r', encoding='utf-8') as f: # 为文件对象命的名放在as后面
txt = f.read(n) # 将文件前3个字符读入到字符串txt中
print(txt)
第3关 逐行读取并输出文件内容
本关任务:编写一个能逐行读取并输出文件内容的小程序。
相关知识
为了完成本关任务,你需要掌握: 1.读文件到字符串 2.文件指针
读文件到字符串
1.f.readline() 从文件中读取单行数据;字符串末尾保留换行符(\n),空行使用 '\n' 表示,该字符串只包含一个换行符。 f.readline() 返回空字符串时,表示已经到达了文件末尾。
n = input()
file = '/data/bigfiles/'+n
with open(file,'r',encoding = 'utf-8') as poem: # 打开文件创建文件对象,命名为poem
while txt := poem.readline(): # 逐行读文件,直至文件结束
print(txt.strip()) # 去除行末的换行符后输出当前读到的字符串
第4关 读取文件到列表中
任务描述
本关任务:编写一个能读取文件到列表中的小程序。
相关知识
为了完成本关任务,你需要掌握: 1.读文件到列表
读文件到列表
1.readlines()
无参数时,读取文件全部数据,返回一个列表,列表中每个元素是文件对象中的一行数据,包括行末的换行符’\n’。
file = input()
with open(file, 'r', encoding='utf-8') as poem: # 打开文件创建文件对象,命名为poem
poem_ls = poem.readlines() # 读取文件,到第10个字符所在的行末
print(poem_ls)
第5关 读取文件中的数据到二维列表
任务描述
本关任务:编写一个能读取文件中的数据到二维列表的小程序。
相关知识
为了完成本关任务,你需要掌握: 1.字符串切分 2.遍历文件转二维列表
字符串切分
1.txt.split(sep)
根据分隔符sep对字符串txt进行切分,返回一个列表。
file = input()
with open('/data/bigfiles/'+file, 'r', encoding='utf-8') as fr: # 打开文件创建文件对象,命名为poem
score_ls = [row.strip().split(',') for row in fr] # 遍历文件对象,row为当前行
print(score_ls) # 输出二维列表
第6关 将唐诗写入到文件中
根据提示,在右侧编辑器补充代码,输入一个3位数字字符表示的诗的序号,从文件“/data/bigfiles/唐诗三百首.txt”中读出指定序号的诗句,再将该诗单独写入到以该诗序号开始的行为文件名的文件中。
测试说明
平台会对你编写的代码进行测试:
测试输入:
237
预期输出: 创建文件:
237刘长卿:送灵澈.txt
def get_poem(file):
"""读唐诗300首,定位到用户输入的序号的诗,将该首诗读取为一个字符串,返回去除末尾空白字符的字符串"""
poem = '' # 空字符串,用于容纳目标诗
poet_flag = False # 做一个标记,假定当前行不是目标诗
with open(file, 'r', encoding='utf-8') as fr: # 创建文件对象
for line in fr: # 遍历文件对象
# 当当前行包含序号(序号用3位数,不足3位前面补0)时,将当前行拼接到poem上,改变poet_flag的值为True
if line[:3] == str(num):
poem = poem + line
poet_flag = True
elif line[0] in '0123456789': # 若当前行不包含序号但有数字
poet_flag = False # 改变标记,后续几行不是目标诗句
elif poet_flag: # 如果标记值为真(True)
poem = poem + line # 将当前行拼接到字符串上
return poem # 遍历结束后返回包含目标诗的字符串
def write_poem(line):
"""参数是包含指定序号诗句的字符串,提取诗的标题行做为要写入的文件名,将全部诗句按顺序写入到文件中,返回诗的标题行"""
title = line.split(maxsplit=1)[0] # 这里的maxsplit参数是最大拆分数,我们只需要拆分一次
with open(title+'.txt', 'w', encoding='utf-8') as f:
f.write(line)
return title
def check_file(file):
"""参数是新创建的文件名,读取新创建并写入诗句的文件,检查是否写入成功,无返回值"""
with open(file, 'r', encoding='utf-8') as fr:
print(fr.read()) # 文件读取为一个字符串并输出
if __name__ == '__main__':
filename = '/data/bigfiles/唐诗三百首.txt' # 源文件路径
num = input() # 输入序号
poem_str = get_poem(filename) # 读取指定序号的诗为字符串
file_title = write_poem(poem_str) # 字符串写入文件,并返回标题
check_file(file_title+'.txt') # 查看写入的文件,输出诗的内容