文件操作

一文件操作

使用open()函数来打开一个文件,

打开文件的方式:

r,w,a,r+,w+,a+,rb,wb,ab,r+b,w+b,a+b.默认使用的是r(只读模式)

二.只读操作

1.

f = open("a1.txt",mode="r",encoding="utf-8")
content = f.read()
print(content)
f.close()

 需要注意encoding表⽰编码集. 根据⽂件的实际保存编码进⾏获取数据, 对于我们⽽⾔. 更
多的是utf-8.

2.rb读出来的数据是bytes类型,在rb模式下.不能选择encoding字符集

f = open("a1.txt",mode="r")
content = f.read()
print(content)
f.close()

rb的作⽤: 在读取非⽂本⽂件的时候. 比如读取MP3. 图像. 视频等信息的时候就需要⽤到
rb. 因为这种数据是没办法直接显⽰出来的. 在后⾯我们⽂件上传下载的时候还会⽤到. 还有我们看到的直播

3.绝对路径和相对路径:

(1)绝对路径:从磁盘根目录开始一直到文件名

(2)相对路径:同一个文件夹下的文件,相对于当前程序所在文件夹而言,如果在同一文件夹中,则相对路径就是这个文件夹名.如果在上一层文件夹,则要../

推荐使用相对路径.因为在我们把程序拷贝给别人使用时,直接把项目拷走就能运行.但用绝对路径还需要拷贝外部文件.

三.读取文件的方法:

1.read()将文件中的内容全部读取出来.弊端,占内存.如果文件过大容易导致内存崩溃

f = open("a1.txt", mode="r", encoding="utf-8")
s = f.read()
print(s)
f.close()
结果:
老男孩是最好的培训机构,
全心全意为学生服务,
只为学生未来,不为牟利。
我说的都是真的。哈哈

2.read(n)读取n 个字符,需要注意的是,如果再次读取,那么会在当前位置继续去读而不是从头读,如果使用的是rb模式,则读取出来的是n个字节

f = open("a1.txt", mode="r", encoding="utf-8")
s = f.read(3)
print(s)
f.close()
结果:
老男孩
f = open("a1.txt", mode="r", encoding="utf-8")
s = f.read(3)
s2 = f.read(3)
print(s)
print(s2)
f.close()
老男孩
是最好

3.readline()一次读取一行数据,注意:readline()结尾,注意每次读取出来的数据都会有一个 所以呢,需要我们使用strip()来去掉 或者空格
4.readlines()将每一行形成一个元素,放在一个列表中.将所有内容都读取出来,所以也是容易内存崩溃的

f = open("../def/哇擦.txt", mode="r", encoding="utf-8")
lst = f.readlines()
print(lst)
for line in lst:
 print(line.strip())
View Code

5.循环读取.这种方式是组好的,每次读取一行内容,不会产生内存溢出的问题

f = open("a1.txt", mode="r", encoding="utf-8")
for line in f:
    print(line.strip())

注意读取完文件的句柄一定要关闭f.close()
四.

写模式(w,wb)

写的时候注意,如果没有文件.则会创建文件,如果文件存在,则将原件中原来的内容删除,在写入新内容

wb模式下.可以不指定打开文件的编码.但是在写文件的时候必须将字符串转化成utf-8的bytes数据

 五.追加(a,ab)

  在追加模式下.我们写入的内容会追加在文件的结尾

f = open("小娃娃", mode="a", encoding="utf-8")
f.write("麻花藤的最爱")
f.close

六.读写模式(r+,r+b)
对于读写模式.必须先读.因为默认光标是在开头的.准备读取的.当读完了之后再进行写入,我们使用的频率最高的是r+

f = open("⼩娃娃", mode="r+", encoding="utf-8")
content = f.read()
f.write("麻花藤的最爱")
print(content)
f.close()
结果:
正常的读取之后, 写在结尾

 r+模式下. 必须是先读取. 然后再写入

七.写读(w+ w+b)

  先将所有的内容清空,然后写入.最后读取.但读取的内容是空的,不常用

 八追加读(a+)

a+模式下,不论先读还是后读.都读取不到数据的.

f = open("⼩娃娃", mode="a+", encoding="utf-8")
f.write("⻢化腾")
content = f.read()
print(content)
f.close

九.其他相关操作

1.seek(n)光标移动到n的位置,注意,移动的单位是byte.所以如果是utf-8的中文部分要是3的倍数

      通常我们使用seek都是移动到开头或者结尾.

     移动到开头:seek(0)

     移动到结尾:seek(0,2)seek的第二个参数表示从哪个位置进行偏移,默认是0表示开头,1表示当前位置,2表示结尾

f = open("⼩娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
print(content)
f.seek(0) # 再次将光标移动到开头
f.seek(0, 2) # 将光标移动到结尾
content2 = f.read() # 读取内容. 什么都没有
print(content2)
f.seek(0) # 移动到开头
f.write("张国荣") # 写⼊信息. 此时光标在9 中⽂3 * 3个 = 9
f.close()

2.tell() 使用tell()可以帮我们获取当前光标位置

f = open("⼩娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
print(content)
f.seek(0) # 再次将光标移动到开头
f.seek(0, 2) # 将光标移动到结尾
content2 = f.read() # 读取内容. 什么都没有
print(content2)
f.seek(0) # 移动到开头
f.write("张国荣") # 写⼊信息. 此时光标在9 中⽂3 * 3个 = 9
print(f.tell()) # 光标位置9
f.close

深坑注意:在r+模式下.如果读取内容.无论读取内容,不论读取内容多少.光标显示的是多少.在写入或者操作文件的时候都是在结尾进行的操作
所以如果想做截断操作. 记住了. 要先挪动光标. 挪动到你想要截断的位置. 然后再进⾏截断
关于truncate(n), 如果给出了n. 则从开头开头进⾏截断, 如果不给n, 则从当前位置截断. 后⾯
的内容将会被删除
十. 修改⽂件以及另⼀种打开⽂件的⽅式
⽂件修改: 只能将⽂件中的内容读取到内存中, 将信息修改完毕, 然后将源⽂件删除, 将新
⽂件的名字改成老⽂件的名字.

# ⽂件修改
import os
with open("⼩娃娃", mode="r", encoding="utf-8") as f1,
 open("⼩娃娃_new", mode="w", encoding="UTF-8") as f2:
 content = f1.read()
 new_content = content.replace("冰糖葫芦", "⼤⽩梨")
 f2.write(new_content)
os.remove("⼩娃娃") # 删除源⽂件
os.rename("⼩娃娃_new", "⼩娃娃") # 重命名新⽂件

弊端: ⼀次将所有内容进⾏读取. 内存溢出. 解决⽅案: ⼀⾏⼀⾏的读取和操作
import os
with open("⼩娃娃", mode="r", encoding="utf-8") as f1,
 open("⼩娃娃_new", mode="w", encoding="UTF-8") as f2:
for line in f1:
   new_line = line.replace("⼤⽩梨", "冰糖葫芦")
   f2.write(new_line)
os.remove("⼩娃娃") # 删除源⽂件
os.rename("⼩娃娃_new", "⼩娃娃") # 重命名新⽂件
原文地址:https://www.cnblogs.com/Bug66/p/9431254.html