python记录_day08
今日内容:文件操作
一、文件基本操作
f = open("文件路径和文件名", mode=" r", encoding="utf-8" )
# open()表示打开一个文件,返回的是一个流,可以理解为操作文件的句柄
# f 变量 将控制文件的句柄赋值给它
read() # 将文件一次性全部读取 弊端:占内存 如果文件过大,容易导致内存崩溃
read(n) # 光标处读取n个字符
readline() #一次读取一行 !!!注意每次读取出来的数据都会有一个\n 所以呢. 需要我们使用strip()来去掉\n或者空格
readlines() # 返回一个列表,元素是每一行的内容 也容易出现内存崩溃问题
推荐使用循环读取
for line in f :
print(line.strip())
每次读取一行,不会出现内存溢出的问题
二、路径问题
绝对路径:从磁盘根目录开始一直到文件名
相对路径:相对程序所在文件夹来说的
三、文件操作模式 mode
r 只读 w 只写 a 追加
rb 读字节 wb 写字节 ab 追加字节
r+ 读写 w+ 写读 a+ 追加、读 (+号可以理解为功能扩展)
r+b 读写字节 w+b写读字节 a+b追加、读、字节
注意:
1、这些只是常见的但并不是全部的
2、常用的是r 、w、r+模式
3、只要是a或者ab, a+ 都是在文件的末尾写入. 不论光标在任何位置
4、带b的就是把字符换成字节. 仅此而已
四、光标操作
可以把光标理解为定位文件操作起点的标记。不管是读写还是其他操作都要都一个开始的位置,光标的的作用就是告诉程序这个位置。
seek(n) #光标移动到n位置 !1!单位是字节
seek(参数1,参数2) # 参数1是偏移量,参数2是从什么位置开始偏移 0表示开头,1表示当前位置,2表示末尾
seek(0) 定位到开头
seek(0,2)定位到末尾
tell() # 获取光标当前位置 单位也是字节
truncate() # 截断 删除光标后所有内容
深坑请注意!!!
在r+模式下. 如果读取了内容. 不论读取内容多少. 光标显示的是多少. 再写入 或者操作文件的时候都是在结尾进行的操作.
所以如果想做截断操作. 记住了. 要先挪动光标. 挪动到你想要截断的位置. 然后再进行截断
关于truncate(n), 如果给出了n. 则从开头进行截断,不管光标在何处, 如果不给n, 则从当前位置截断. 后面的内容将会被删除
ex:
小娃娃.txt 内容
小娃娃想吃冰糖葫芦了
1 f = open("小娃娃.txt",mode="r+",encoding="utf-8") #小娃娃想吃冰糖葫芦了 2 content = f.read(3) #读取3个字符 3 print(f.tell()) #9 4 f.write("买不买") # 按道理应该在字节9的位置写入,可结果是在最后写入的 小娃娃想吃冰糖葫芦了买不买 5 print(content) #小娃娃 6 f.flush() 7 f.close() 8 9 10 f1 = open("小娃娃.txt",mode="r+",encoding="utf-8") 11 content = f1.read(3) #读取3个字符 12 print(f1.tell()) #9 13 f1.truncate() # 按说应该从开头截取的光标9的位置,但结果是从开头截到了结尾 14 f1.seek(6) 15 f1.truncate() #小娃 挪动光标后截取了 16 f1.flush() 17 f1.close()
五、文件修改
只能将文件中的内容读取到内存中, 将信息修改完毕, 然后将源文件删除, 将新文件的名字改成老文件的名字
1 # 文件修改步骤: 从源文件读取 --> 修改-->写入副本-->删除源文件-->重命名副本 2 import os 3 with open("小娃娃.txt",mode="r",encoding="utf-8") as f1, \ 4 open("小娃娃副本.txt",mode="w",encoding="utf-8") as f2: 5 content = f1.read() 6 new_content = content.replace("小娃娃","小屁孩儿") 7 f2.write(new_content) 8 os.remove("小娃娃.txt") 9 os.rename("小娃娃副本.txt","小娃娃.txt") 10 # 这种写法有弊端, 一次将内容进行读取,容易造成内存溢出,推荐一行一行读取 11 12 with open("小娃娃.txt",mode="r",encoding="utf-8") as f1, \ 13 open("小娃娃副本.txt",mode="w",encoding="utf-8") as f2 : 14 for line in f1: 15 new_line = line.replace("小娃娃","小屁孩儿") 16 f2.write(new_line) 17 18 os.remove("小娃娃.txt") 19 os.rename("小娃娃.txt","小娃娃副本.txt")