9.1文件操作流程
1.打开文件,得到文件句柄并赋值给一个变量
2.通过句柄对文件进行操作
3.关闭文件
9.2 文件读写及关闭操作
#!Author:lanhan
#data = open("yesterday",encoding="utf-8").read()
#f = open("yesterday",‘w‘,encoding="utf-8") #文件句柄,也就是内存对象
f = open("yesterday",‘a‘,encoding="utf-8")
#读文件,默认是r(读)[文件读一次后,再读第二遍时从内容最下面继续读],w(写,覆盖原文件),a(在源文件基础上追加).一次操作要么是读,要么是写,不能同时进行
#data = f.read()
#print(data)
f.write("\n我爱北京天安门。。。。。。。\n") #\n换行
f.write("天安门上太阳升。。。。。。。。。") #写文件就是覆盖原来文件,写一个新文件
f.close() #关闭文件
扩展:
#f = open("yesterday",‘r+‘,encoding="utf-8") #r+ 读写(可读可追加写)
#f = open("yesterday",‘w+‘,encoding="utf-8") #w+ 写读(创建新文件追加写,源文件不能读,只能读新创建的文件)
#f = open("yesterday",‘a+‘,encoding="utf-8") #a+ 追加读写
print(f.readline())
print(f.readline())
f.write("--------diao-----------1\n")
f.write("--------diao-----------1\n")
f.write("--------diao-----------1\n")
print(f.tell())
f.seek(10)
print(f.readline())
f.write("should be at the begining of the second line")
f.close()
#f = open("yesterday",‘rb‘) #二进制文件格式读文件(网络传输、视频等)
f = open("yesterday",‘wb‘) #二进制文件格式写文件(网络传输、视频等)
f = open("yesterday",‘ab‘)
f.write("hello binary\n".encode()) #.encode()将字符串转换成二进制
f.close()
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
- rU
- r+U
9.3 循环读
#!Author:lanhan
f = open("yesterday",‘r‘,encoding="utf-8")
#读取前5行(若是到第10行停止,加一个判断即可)
#for i in range(5):
#print(f.readline())
‘‘‘#ow loop
#读取文件的每一行(方法1和方法2,是将文件全部读取到内存中,当数据量较大时,则内存可能被撑爆)
#for line in f.readlines(): #方法1
#print(line)
#方法2
for index,line in enumerate(f.readlines()):
if index == 9:
print(‘-----我是分割线----------‘)
continue
print(line.strip())
‘‘‘
#方法3(high bige) 读一行,保存一行到内存中,再大数据也不怕
count = 0
for line in f:
if count == 9:
print(‘------我是分割线--------‘)
count += 1
continue
print(line)
count +=1
9.4 文件高级操作
#!Author:lanhan
f = open("yesterday",‘r‘,encoding="utf-8")
print(f.tell())
print(f.readline())
print(f.tell())
print(f.readline())
print(f.readline())
print(f.tell()) #打印当前指针位置
f.seek(10) #查找指针位置10,0是文件开头
print(f.readline())
#f.detach() #文件编辑过程中,改变编码
#print(f.fileno())#返回内存地址编号
#print(f.seekable()) #判断指针是否能移动,能移动返回为true(d打印机不能移动)
print(f.encoding) #打印文件编码
print(f.name) #打印文件名
print(f.writable()) #判断文件可写
print(f.flush()) #文件写是先写到内存中,然后内存达到一定值后,才写进硬盘中,flush将写入内存中的内容,强制刷新到硬盘
import sys,time
for i in range(20):
sys.stdout.write("#")
sys.stdout.flush()
time.sleep(0.1)
f = open("yesterday",‘a‘,encoding="utf-8")
#f.write("妹妹的")
f.seek(10)
f.truncate(20) #从指针位置往后截断10个字符,指针前面内容保持不变(为空,清空文件)
9.5 文件修改
#!Author:lanhan
‘‘‘
f = open("yesterday","r",encoding="utf-8")
f_new = open("yesterday.bak","w",encoding="utf-8")
for line in f:
if "肆意的快乐等我享受" in line:
line = line.replace("肆意的快乐等我享受","肆意的快乐等lanhan享受")
f_new.write(line)
f.close()
f_new.close()
‘‘‘
import sys
f = open("yesterday","r",encoding="utf-8")
f_new = open("yesterday.bak","w",encoding="utf-8")
find_str = sys.argv[1]
replace_str = sys.argv[2]
for line in f:
if find_str in line:
line = line.replace(find_str,replace_str)
f_new.write(line)
f.close()
f_new.close()
扩展:
#!Author:lanhan
with open("yesterday","r",encoding="utf-8") as f: #当with代码块执行完毕时,内部会自动关闭并释放文件资源
for line in f:
print(line)
‘‘‘
#with又支持同时对多个文件的上下文进行管理
with open("yesterday","r",encoding="utf-8") as f1, \ #官方建议一行代码不超过80字符,多行时用\
open("yesterday2","r",encoding="utf-8") as f2
pass
‘‘‘