# py做文件操作
# 文件操作三种模式
# r read
# w write 创建
# a append
# 创建模式
f=open("test1.txt",mode="w")
f.write("曹娜是我的脑残粉\n")
f.write("思汗是我的脑残粉\n")
f.close()
# 只读模式,不能读现在
f=open("test.txt",mode="r")
data=f.read()
# data=f.read(3)
print(data)
f.close()
# 追加模式,不能读现在
f=open("test1.txt",mode="a")
f.write("思泽是我的脑残粉\n")# 在最后一行追加
f.close()
# 文件循环
# 在读的模式下,循环每行,spilt去空格
f=open("test1.txt",mode="r") #
# def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True): # known special case of open open函数参数
print(f.readlines())
for line in f:
line=line.split()#去空格
height=int(line[1])
if height>160:
print(line[0])
#文件操作
f=open("test.txt","r")
# print(f.read())#读全部,原文件显示
# print(f.readline())#读一行 参数可填读几行
# print(f.readlines())#读全部,返回是一个列表
f.seek(2)#光标移动位置往后操作,
# seek移动的是多少个字节,而不是字符,英文无所谓,一个字节是一个字符,但是中文是3个字节一个字符。所以如果参数是2,并且是中文,会报错
print(f.readline())
f.flush() # 把缓存数据强制刷到硬盘上,
f.readable()# 是否可读
f.seekable()
f.tell() #返回光标当前位置
f.truncate(100) #指定长度,从0阶段到100指定长度,也是截断字节
f.truncate()#如果不写参数,就从当前光标截断到最后
# 混合模式
# w+ 写读
f=open("write_and_read","w+")
f.write("caona1\n")
f.write("caona2\n")
f.write("caona3\n")
f.seek(0)
print(f.readline())
# r+ 读写
f=open("write_and_read","r+")
f.write("caona4\n")#尾部追加
f.write("caona5\n")
f.write("caona6\n")
print(f.readline()) #写的光标在最后,读的光标在最前面
# a+ 追加读,文件一打开光标在尾部,写的数据以追加形式
f=open("write_and_read","a+")
f.write("haha\n")
f.write("haha\n")
print(f.readline())
f.seek(0)
print(f.readline())
#修改文件
f=open("test.txt","r+")
f.seek(5)
f.write("曹娜")# 新写的数据会覆盖原来的数据,而不是数据后移。不是我们想要的结果,因为,文件在硬盘存储,已经占据一定内存空间,如果去增加数据,只会把原始文件覆盖掉,是硬盘的存储原理导致的。
# 所以有一种修改文件的方式,就是不占内存,占硬盘的修改方式,先从硬盘读取文件到内存,然后再创建一个新文件,一边读取原文件,把原文件和要修改的数据写入新文件中。形成一个新的文件。
# 不占内存占硬盘方式修改文件 ,需求是把南通改成北京
import os
old_file="test1.txt"
new_file="test_new.txt"
f=open(old_file,"r")
f_new=open(new_file,"w")
old_str="南通"
new_str="北京"
for line in f:
if "南通" in line:
line=line.replace(old_str,new_str)
f_new.write(line)
f.close()
f_new.close()
os.rename(new_file,old_file) # 重命名
(需要练习作业)