分享

第15关,文档读写易错点笔记

 闲逸白发 2020-04-18

15关,文档的读和写

Q1:路径语法报错有问题?

A1:

1)检查一下路径格式,有同学复制粘贴的时候把运行地址也粘贴进去了

2)确认是否是win系统,如果是,在路径前面加r,或更改为双斜杠

Q2:UnicodeDecodeError报错(类型1)

A2:修改第1行代码encoding='utf-8'为encoding=‘gbk’

#这里有部分同学不太熟悉,会写成uft-8,报错会有详细提示

(图片待补充)

Q3:文档打开是乱码问题

A3:

修改右下角编码“utf-8”为“gbk”试试,部分电脑系统默认为gbk。遇到类似的错误尝试多改几次

步骤为:点击编码>>>通过编码重新打开>>>输入gbk查找就可以选择

Q4:非法字符/ufeff(或者空格)

A4:将代码中的'utf-8'改为'utf-8-sig'

Q5:为什么第二次read没有值

自动检测
f=open('   ','r','encoding='')
a=f.read()
b=f.read()
打印a有值,b没有值

A5:因为读了一次文件后光标已经到了文件的末尾了,所以再读就读不到内容了

Q6:unicodedecode error:无效字节(类型2)

A6:重新解码查看,代码是否是正确的

本题错误如上

编码,即将人类语言转换为计算机语言,就是【编码】encode();反之,就是【解码】decode()

Q7:为什么会出现很多遍“难念的经”

自动检测
f1 = open('./1.txt','a',encoding='utf-8') 
#以追加的方式打开一个文件,尽管并不存在这个文件,但这行代码已经创建了一个txt文件了
f1.write('难念的经')
#写入'难念的经'的字符串
f1.close()           
#关闭文件 
f2 = open('./1.txt','r',encoding='utf-8')
#以读的方式打开这个文件
content = f2.read()
#把读取到的内容放在变量content里面
print(content)
#打印变量content
f2.close()
#关闭文件

A7:因为a是追加模式,每次运行是在1.txt追加,每次追加后1.txt内容都有更新。运行次数过多,可检查1.txt,每次只添加一次“难念的经”

Q8:哈利波特&赫敏的成绩分数代码解释

自动检测
file = open(r'E:\python code\基础语法\15关\赫敏','r',encoding='utf-8')
file_lines = file.readlines()
#['罗恩 23 35 44\n', '哈利 60 77 68 88 90\n', '赫敏 97 99 89 91 95 90\n', '马尔福 100 85 90']
file.close()
final_scores = []
for i in file_lines:
data =i.split()
sum = 0
for score in data[1:]:
sum = sum int(score)
#这里是遍历列表,得到列表中的分数并且相加
result = data[0] str(sum) '\n'
#也就是变量result为名字(对应的为偏移量0) 总分数 换行标志
final_scores.append(result)
winner = open('winner.txt','w',encoding='utf-8')
winner.writelines(final_scores)
winner.close()
#写入换行的内容

A8:

1)关于realines()函数作用及用法:用于读取所有行(直到结束符 EOF)并返回列

>>>也就是输出结果为:

['罗恩 23 35 44\n', '哈利 60 77 68 88 90\n', '赫敏 97 99 89 91 95 90\n', '马尔福 100 85 90']

2)关于split() 函数的作用及用法:拆分字符串。通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list)

>>>也就是输出结果为:

['罗恩', '23', '35', '44']

['哈利', '60', '77', '68', '88', '90']

['赫敏', '97', '99', '89', '91', '95', '90']

['马尔福', '100', '85', '90']

Q9:课程必做练习题解释

自动检测
file1 = open('winner.txt','r',encoding='utf-8') 
file_lines = file1.readlines() 
file1.close()
dict_scores = {}
list_scores = []
final_scores = []
# print(file_lines) 
# print(len('\n'))
# 打印结果为:['罗恩102\n', '哈利383\n', '赫敏570\n', '马尔福275\n']
# 经过测试,发现'\n'的长度是1。所以,名字是“第0位-倒数第5位”,分数是“倒数第4位-倒数第二位”。
# 再根据“左取右不取”,可知:name-[:-4],score-[-4:-1]
for i in file_lines:  # i是字符串。
    print(i)
#i的值为
#['罗恩', '23', '35', '44']
#['哈利', '60', '77', '68', '88', '90']
#['赫敏', '97', '99', '89', '91', '95', '90']
#['马尔福', '100', '85', '90']
    name = i[:-4]  # 取出名字(注:字符串和列表一样,是通过偏移量来获取内部数据。)
#i=['马尔福', '100', '85', '90','\n']
#name = i[:-4],所以输出形式name的值为['马尔福']
    score = int(i[-4:-1])  # 取出成绩
    print(name)
    print(score)
    dict_scores[score] = name  # 将名字和成绩对应存为字典的键值对(注意:这里的成绩是键)
    list_scores.append(score)
# print(list_scores)
list_scores.sort(reverse=True)  # reverse,逆行,所以这时列表降序排列,分数从高到低。
# print(list_scores)
for i in list_scores:
    result = dict_scores[i] str(i) '\n'
    # print(result)
    final_scores.append(result)
print(final_scores)  # 最终结果
winner_new = open('winner_new.txt','w',encoding='utf-8') 
winner_new.writelines(final_scores)
winner_new.close()

A9:

1)负数索引从后往前数,本题中对应的索引如图

2)sort排序:从大到小排列,拓展知识点见山脚sort,sort函数

Q10:为什么诗歌最后一句没有更新

A10:内容并非完全一致,查看最后一句的转行符号是否添加

Q11:罗恩打印结果未编码?

A11:文档的编码格式和代码的解析编码格式不一致,需要将文档的编码格式和代码的编码格式统一为utf-8(注意,另存为文档时记得要覆盖原来的文档)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多