前言
最近几天学到了很多东西,准备好做第一个'大作业'(ATM机+商店)。总结一下这几天学到的知识。大作业可能要写3~5天。准备战斗!
文件操作
不符合正常编写规范难以对文件内容进行修改,应该给文件的打开对象赋一个变量后,对变量进行操作,以实现对文件对象的修改。这个变量通常称为文件句柄。
句柄赋值
ps:后面的test file 为一个text文件里面只有一行:This quick brown fox jumped over the lazy dog.
f = open("test file",'r',encoding="utf-8")#一般称f为文件句柄(包括了文件的字符集、大小、内存中的起始位置)。 data1 = f.read()#默认读全部,()填数字代表读到文件中最大index(光标处)处。 data2 = f.read() print(data1) print(data2)#打印不出data2,原因:第一次读f.read,文件中的光标已经到了最后一行,再往下全是空白。 f.close()
几种文件的打开方式
f = open("test file",'a')#以追加的方式打开文件,无法读取数据可以在后面追加数据,不会清空文件 f = open("test file",'r')#以读取的方式打开文件,无法改变文件内容 f = open("test file",'r')#以写入的方式打开文件,先清空文件,后可以执行write语句。 f = open("test file 2",'r+')#这种格式为'读写'既能读又能写,不会清空原 f = open("test file 3",'w+') #这种格式为'读写'既能读又能写,但一开始清空文件 f = open("test file 3",'rb') #以二进制的格式去读文件,不能有encoding参数 f = open("test file 3",'wb') #以二进制的格式去写文件,只能传入byte_like 的数据,写的时候必须指定encoding。(必须知道现在是什么字符集)
跨平台、数据流视频的时候使用二进制。
文件的读取(要求:读取文件所有内容)
print(f.readline())#读取了第一行,光标移到第二行开头。 '''法1''' f = open("test file",'r',encoding="utf-8")。 for lines in f.readlines():#.readlines可生成一个列表,依次将文件每行的数据变成列表中的值。 print(lines.strip()) f.close() '''法2''' f = open("test file",'r',encoding="utf-8") for index,line in enumerate(f.readlines()): #这种读法(一次性全读完)容易造成电脑卡死。 if index == 2: print('----我是分割线-----') continue print(line.strip()) f.close() '''法3''' for line in f: print(lines.strip)
小结:法1,2生成了一个列表需要读取文件全部内容,容易卡死。而法3则是生成了一个迭代器(后面会学),不容易造成卡死。
文件的读取
f = open("test file 2",'r',encoding="utf-8") print(f.read(20))#输出为This quick brown fox jumped over the lazy dog. print(f.tell()) #返回文件中光标指针的位置(按照字符的个数记),输出为20 f.seek(0)#把光标移回一开始 print(f.encoding)#输出编码文件的方式 f.flush()#一次性将所有数据刷到硬盘上,不经过缓存。存钱 print(f.fileno())#返回文件句柄在内存中的编号 #f.truncate(50)#默认清空文件,填入数字,在第n个字符串后面全部删除。和光标没有关系
文件的写入
f = open("test file 3",'w+',encoding="utf-8") #这种格式为'读写'既能读又能写 print(f.readline()) print(f.readline()) f.write("----- ") f.write("----- ") f.write("----- ") f.write("----- ") f.seek(10) f.write("step in position 10")#仍然写在了末端 print(f.readline()) with open('test file 3','r') as f1 , open('test file 2','r') as f2: #用with open方法用完文件后自动关闭,可以防止文件句柄占用内存。打开多个文件用这种格式。,表示代码换行
---
文件的修改
• 文件修改的两种方式
1. 将文件数据放在内存中,在内存中修改会自动把原来内容“往后挤”,而在硬盘中会“自动覆盖”。
2. 打开一个文件,修改完了将全部数据写在新文件里。
#修改文件特定的参数,如把fox改成pig import sys f = open('test file 3','r',encoding='utf-8') f_new = open('test file 3.bak','w',encoding='utf-8') for line in f: if "fox" in line: line =line.replace("fox","pig") f_new.write(line) sys.argv f.close() f_new.close()
进度条缓慢生成的实现
import sys,time print("-----第一组-------") for i in range(20): sys.stdout.write ("#")#代表打印 time.sleep(0.1)#没有flush会等缓存区满了以后一下子蹦出来,将缓存刷到硬盘上 print(" ----第二组-------") for i in range(20): sys.stdout.write ("#") sys.stdout.flush() time.sleep(0.2)# '#'会缓慢地蹦出来