编码与文件读写练习

练习1 数据转移中的变化

练习目标
我们会通过今天的作业,复习课堂上学到的知识:编码和解码以及文件读写。

练习要求
今天的练习包含3个小练习。
练习1:主要是想要你自己来动手操作一下编码和解码;
练习2:尝试一下图片的读写;
练习3:完成文件转移之间的数据处理,让数据发生变化。

练习1:编码和解码
请你根据代码中的要求,一步一步完成。

# 1.分别使用gbk和utf-8编码自己的名字,并将其打印出来。
print('许愿'.encode('utf-8'))
print('许愿'.encode('gbk'))
# 2.复制上一步得到的结果,进行解码,打印出你的名字(两次)。
print(b'\xe8\xae\xb8\xe6\x84\xbf'.decode('utf-8'))
print(b'\xd0\xed\xd4\xb8'.decode('gbk'))
# 3.使用gbk解码b'\xb7\xe7\xb1\xe4\xbf\xc6\xbc\xbc\xd3\xd0\xd2\xe2\xcb\xbc',并打印出来。
print(b'\xb7\xe7\xb1\xe4\xbf\xc6\xbc\xbc\xd3\xd0\xd2\xe2\xcb\xbc'.decode('gbk'))
>>>
b'\xe8\xae\xb8\xe6\x84\xbf'
b'\xd0\xed\xd4\xb8'
许愿
许愿
风变科技有意思

练习2:通过文件读写,复制图片
请你通过文件读写命令,读取 photo1 里的数据(提示见代码区开头)。然后,新建名为“photo2”的图片(在同一个文件夹),写入读到的数据。这样,我们就通过文件读写的代码,完成了图片的复制(而非鼠标右键)。

#第一步是打开图片
with open(r'c:\Users\white\Desktop\test1\photo1.png','rb') as file:  #以'rb'模式打开,见笔记
    data = file.read()
    with open(r'c:\Users\white\Desktop\test1\photo2.png','wb') as newfile:  #在test1文件中新建一个photo2.png的图片
        newfile.write(data)                                                 #把photo1复制的数据,放到photo2中,实现图片复制

练习3:在读写之间处理数据-1
在课堂上,我们已经见识过了:文件的一读一写之间,可以对数据进行一定的处理。
请你运行一次右侧的代码,重新体验一下那个过程。

# 对文本文档内容按照数字大小排序,但是有严格的格式局限性,下面方法只能适用“姓名两个字符,分数三个字符,且最后换行”的文本要求

# 第一部分:读文件内容
file1 = open(r'C:\Users\white\Desktop\test1\winner.txt','r',encoding='utf-8')
file_lines = file1.readlines()   #按行读取内容
file1.close()

# 建立变量
dict_scores = {}         #新建空字典
list_scores = []         #新建空列表
final_scores = []        #新建空列表

# 测试代码
# print(file_lines)# 打印结果为:['罗恩102\n', '哈利383\n', '赫敏570\n',],把'马尔福275\n'去掉了,因为格式不满足要求
# print(len('\n'))# 经过测试,发现'\n'的长度是1。所以,名字是“第0位-倒数第5位”,分数是“倒数第4位-倒数第二位”。
# 再根据“左取右不取”,可知:name-[:-4],score-[-4:-1],这个方式只针对前面三个人,马尔福就不符合这个

# 对文本内容存储到字典和列表
for i in file_lines: # i是字符串。
    #print(i)
    name = i[:-4] # 取出名字(注:字符串和列表一样,是通过偏移量来获取内部数据。)
    score = int(i[-4:-1]) # 取出成绩
    #print(name)
    #print(score)
    dict_scores[score] = name # 将名字和成绩对应存为字典的键值对(注意:这里的成绩是键)
    list_scores.append(score) #把成绩放入列表中

# print(dict_scores)
# print(list_scores)

#对列表内容排序
list_scores.sort(reverse=True) # reverse,逆行,所以这时列表降序排列,分数从高到低。
# print(list_scores)

#排序后重新存储
for i in list_scores:
    result = dict_scores[i] + str(i) + '\n'#利用分数作为键找打键值(姓名)+键的字符+换行,实现:赫敏561\n,这种格式
    # print(result)
    final_scores.append(result)#重新排列的结果放在一个新的列表中

# print(final_scores) # 最终结果

#将最终排序结果写到新文本winner_new
winner_new = open('winner_new.txt','w',encoding='utf-8')#将排序的结果写出一个新的文本
winner_new.writelines(final_scores)
winner_new.close()
>>>
winner_new文档内容:
赫敏561
哈利383
罗恩102

练习2 古诗默写

练习目标
这个练习,会让你学会一种方法,可以直接修改原文件中的数据。

练习要求
语文老师将一些古诗存在txt文档里,一句一行。最近,他计划抽一些古诗,自己设置一些空来让学生默写。请你用代码帮老师完成这项工作(只要处理了一个文档,加上循环就能处理无数个文档了)。

【讲解】
明确目标很重要(所以重复三遍)。
做到后面的步骤,可再点开左侧的“练习介绍”查看。
我们以李商隐的《锦瑟》为例,这是原文档里的内容:

锦瑟
[唐] 李商隐
锦瑟无端五十弦,
一弦一柱思华年。
庄生晓梦迷蝴蝶,
望帝春心托杜鹃。
沧海月明珠有泪,
蓝田日暖玉生烟。
此情可待成追忆,
只是当时已惘然。

老师在这首诗想考学生“一弦一柱思华年。”和“只是当时已惘然。”,即他想得到的是:
锦瑟
[唐] 李商隐
锦瑟无端五十弦,
____________。
庄生晓梦迷蝴蝶,
望帝春心托杜鹃。
沧海月明珠有泪,
蓝田日暖玉生烟。
此情可待成追忆,
____________。

【提示】
为了让代码逻辑简洁且便于更新,可以将需要默写的诗句都放到一个列表里。
另外,当遇到默写诗句时,可以用英文的下划线去替代(____________)。

list_test = ['一弦一柱思华年。\n','只是当时已惘然。\n'] #需要默写的句子,提前放在列表
with open (r'C:\Users\white\Desktop\test\poem.txt','r',encoding='utf-8') as f:  #读文件内容
    lines = f.readlines()
# print(lines)
with open('poem2.txt','w',encoding='utf-8') as new: # 新生成一个文本,用来默写古诗
    for line in lines: 
        if line in list_test:
            new.write('____________。\n')  #默写的句子用___________。代替
        else:
            new.write(line) #不用默写的句子保持不变
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值