文件读写:
一,读取文件
三个步骤:打开文件 - 读取文件 - 关闭文件
file1 = open('/Users/Ted/Desktop/test/abc.txt','r',encoding='utf-8')
#r 表示以读的形式读取文件
#w 表示以写的形式读取文件
# a 就是append 追加
filecontent = file1.read()
print(filecontent)
file1.close()
为什么要关闭文件?
-
计算机能够打开的文件数量是有限的,open()过多,而不close()的话,就不能再继续打开了。
-
能保证写入的内容已经在文件里保存好了。
文件关闭之后就不能再对这个文件进行读写了。需要重新open()。
二,写入文件:
写入文件需要三个步骤:
打开文件——写文件——关闭文件
file1 = open('/Users/Ted/Desktop/test/abc.txt', 'w',encoding='utf-8')
file1.write('张无忌\n')
file1.write('宋青书\n')
这里写入文件的时候需要写上"w",但是这样’w‘会暴力清空掉文件里面的原有数据,如果想要继续添加的数据,而不是完全覆盖的话就用’a’模式,表示append,追加的意思。
file1 = open('/Users/Ted/Desktop/test/abc.txt', 'a',encoding='utf-8')
#以追加的方式打开文件abc.txt
file1.write('张无忌\n')
#把字符串'张无忌'写入文件file1
file1.write('宋青书\n')
#把字符串'宋青书'写入文件file1
file1.close()
这样的话就会追加,而不是覆盖了。
write()函数写入文本文件的也是字符串类型
在’w’,'a’模式下,如果打开的文件不存在则open()函数会自动创建一个。
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()
#关闭文件
举例:
算学生的总分:
file = open('/Users/Ted/Desktop/scores.txt','r',encoding='utf-8')
file_lines = file.readlines()
#因为想分开处理四个人的成绩,并不是直接都加起来,所以用readlines()函数,按行读取
file.close()
final_scores = [] #创建一个空列表
for i in file_lines:
data =i.split() #把列表里的数据切割,split()切割函数
sum = 0 #用来存放每个人的总成绩
for score in data[1:]: #因为列表里的第一个(下标为0)都是名字,名字不能加
# 所以要从下标为1开始到最后 【1:】表示从第二个元素开始到结束
sum = sum + int(score) #因为里面的成绩都是字符串所以要转换成 int 型
result = data[0]+str(sum)+'\n' #data[0]表示名字
final_scores.append(result)
#把成绩写入到新的文件里面
winner = open('/Users/Ted/Desktop/winner.txt','w',encoding='utf-8')
winner.writelines(final_scores)
winner.close()
代码是以writelines()的方式写进去,为什么不能用write()?
因为final_scores是一个列表,而write()的参数必须是一个字符串,而writelines()可以是序列,所以我们使用writelines()。
with open ....... as : # as 后面写变量名字,这样的形式不需要单独写代码关闭文件
比如下面这个:
with open('photo1.png','rb') as file:
#注意这里是 rb
data = file.read()
with open('photo2.png','wb') as newfile:
#这里是wb
newfile.write(data)
上面哈利波特的举例:
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)
name = i[:-4] # 取出名字(注:字符串和列表一样,是通过偏移量来获取内部数据。)
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()