文件的操作
文件操作初识
- 需要那些参数?
- 文件路径——推荐相对路径
- 打开方式
- 编码方式
- 命令:open()
- 内置函数
- 底层调用的是操作系统的接口
- 基本格式
f = open("C:\购物车.txt",encoding="utf-8",mode="r")
content = f.read()
print(content)
f.close()
#说明:
# f : 变量 文件句柄
# f.read() —— 对文件进行的任何操作都需要通过文件句柄.的方式
# encoding="utf-8" —— 可以不写,默认的编码是操作系统默认的编码
# f.close() —— 关闭文件,不关会占用内存
# mode="r" —— 不写的话默认读
- 操作三部曲
- 打开文件
- 对文件句柄进行相应的操作
- 关闭文件
- 常见的问题
- 路径问题
- Windows的路径分割符是\,会有不可预知的错误
- 解决方法:
- 在每个\前再加一个\
- 在路径的最前面加个r
- repr():显示数据的原生态
- 编码问题
- UnicodeDecodeError:文件存储时与文件打开时用的编码不一致
- 路径问题
操作文件的读
- r
# read 全部读出来
f = open("C:\购物车.txt",encoding="utf-8",mode="r")
content = f.read()
print(content)
f.close()
#read(n) 按照字符读取
#读文本代表读取n个字符;打开方式为b模式时,代表读取n个字节
f = open("C:\购物车.txt",encoding="utf-8",mode="r")
content = f.read(4) #读取前4个字符
print(content)
f.close()
# readline() 按照行读取
f = open("C:\购物车.txt",encoding="utf-8",mode="r")
content = f.readline() #读取一行
print(content)
f.close()
#readlines() 原文件的每一行读出来,并形成列表,每个元素时文件中的每一行
f = open("C:\购物车.txt",encoding="utf-8",mode="r")
content = f.readline()
print(content)
f.close()
#for 循环读取 适合读取大文件,以上4种适合读取小文件
#文件句柄就是个迭代器
f = open("C:\购物车.txt",encoding="utf-8",mode="r")
for line in f:
print(line)
f.close()
- rb:操作的是非文本文件,用rb模式不需要设置encoding
f = open(r"C:\Users\liuguixiang\Pictures\截图\图像 002.jpg",mode="rb")
content = f.read()
print(content)
f.close()
- r+ :打开一个文件用于读写。文件指针默认将会放在文件开头
- 注意:在读写模式下,先写后读,那么文件中的默认光标是在开始,先写则写入的内容会将原内容覆盖掉,直到覆盖到你写完的内容,然后在后面开始读取。
- r+b
文件的写操作
- w
f = open(r"C:\test.txt",encoding="utf-8",mode="w")
f.write("sdfg")
f.close()
#没有文件时新建文件并写入内容;文件存在时,会先清空再写入
#文件句柄关闭之后再以w模式打开才会清空,只要没有关闭就可以持续写入
- wb
f = open(r"C:\Users\liuguixiang\Pictures\截图\图像 002.jpg",mode="rb")
content = f.read()
f.close()
f1 = open(r"C:\Users\liuguixiang\Pictures\截图\test.jpg",mode="wb")
f1.write(content)
f1.close()
#可以作为拷贝非文本文件
- w+
- w+b
文件的追加
- a
f = open("C:\购物车.txt",encoding="utf-8",mode="a")
content = f.write()
f.close()
#文件不存在时,会创建内容,然后追加;如果文件存在,那么直接在最后追加内容
- ab
- a+
- a+b
文件的其他操作
- seek()
seek(n)光标移动到n位置,注意:移动单位是byte,所以如果是utf-8的中文部分是3的倍数
通常用来把光标移动到开头或结尾
seek(0) :移动到开头
seek(0,2) :移动到结尾
seek(0,1) :当前位置
seek的第二参数表示的是从哪个位置进行偏移,默认是0,表示开头;2表示结尾
#根据编码适当改变字节
- tell()
使用tell()可以获得光标的位置,查看的是字节数
- readable(),writeable()
- flush 强制刷新
打开文件的另一种方法
with open("C:\购物车.txt",encoding="utf-8",mode="r") as f:
print(f)
with open("C:\购物车.txt",encoding="utf-8",mode="r") as f,\
open(r"C:\Users\liuguixiang\Pictures\截图\图像 002.jpg",encoding="utf-8",mode="r") as f2:
print(f)
- 优点:
- 不需要手动close文件句柄
- 可以同时打开多个文件
文件的改操作
改操作的五步走
- 以读的模式打开原文件
- 以写的模式创建新文件
- 将原文件的内容读出来,修改成新内容,写入新文件
- 将原文件删除
- 将新文件重命名成原文件
import os
with open(r"C:\Users\liuguixiang\购物车.txt",encoding="utf-8",mode="r") as f1,\
open(r"C:\Users\liuguixiang\购物车back.txt",encoding="utf-8",mode="w") as f2:
old_content = f1.read()
new_content = old_content.replace("商品","abc")
f2.write(new_content)
os.remove(r"C:\Users\liuguixiang\购物车.txt")
os.rename(r"C:\Users\liuguixiang\购物车back.txt",r"C:\Users\liuguixiang\购物车.txt")
#进阶版
import os
with open(r"C:\Users\liuguixiang\购物车.txt",encoding="utf-8",mode="r") as f1,\
open(r"C:\Users\liuguixiang\购物车back.txt",encoding="utf-8",mode="w") as f2:
for line in f1:
new_line = line.replace("商品","abc")
f2.write(new_line)
os.remove(r"C:\Users\liuguixiang\购物车.txt")
os.rename(r"C:\Users\liuguixiang\购物车back.txt",r"C:\Users\liuguixiang\购物车.txt")