环境小硕的转行之路-8-文件操作

前言


最近几天学到了很多东西,准备好做第一个'大作业'(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("-----\n")
f.write("-----\n")
f.write("-----\n")
f.write("-----\n")
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("\n----第二组-------")
for i in range(20):
    sys.stdout.write ("#")
    sys.stdout.flush()
    time.sleep(0.2)# '#'会缓慢地蹦出来

 

posted @ 2019-08-13 17:56  negu  阅读(142)  评论(0编辑  收藏  举报