Python 的文件操作
一 初识文件操作
使用Python来读写文件是非常简单的操作,我们使用open()函数来打开一个文件,获取文件句柄,然后通过文件句柄就可以对文件进行各种各样的操作,打开的方式不一样能执行的操作也会有相应的差距
打开文件的方式: r , w , a , r+ , w+ , a+ , rb , wb , ab , r+b , w+b , a+b 默认使用的是r (只读)模式
1 文件操作的函数
open(文件名(路径)),mode="?",encoding= "字符集")
2 只读操作 mode = "r"
(1) 绝对路径: 从磁盘的根目录寻找 或者 从互联网上寻找一个路径
(2) 相对路径: 相对当前程序所在的文件夹 ../上一层文件夹 (用的最多)
f = open("王者荣耀你好.txt",mode="r",encoding="utf-8") s = f.read() print(s) f.close() # 这个必须写 不然后面的操作容易报错 #结果 读出文件中的内容 适用于 .TXT 文件
一次只读一行 readline()
f = open("王者荣耀你好.txt",mode="r",encoding='utf-8') while 1: s = f.readline().strip() if s != "": #判断当读出的部位 空 则执行 print(s) f.close() # while 比较占内存 可以用于文件监控 但是不实用
for 循环不占内存, 同时自动读完停止
f = open("王者荣耀你好.txt",mode='r',encoding='utf-8') for i in f: # 文件是一个可迭代的对象 print(i.strip()) # 可以一行一行的读 f.close()
3 只写操作
带w的 只要你操作了,就会清空源文件 如果文件不存在 就会自动创建新文件
f = open("歌曲菜单.txt",mode="w",encoding="utf-8") # 没有文件自动创建 s = f.write("你说嘴巴嘟嘟,我送你江南七妹也") f.flush() f.close() f = open("王者荣耀你好.txt",mode="w",encoding="utf-8") #有文件 则删除源文件 自动创建新文件 s = f.write("你个垃圾还玩王者") f.flush() f.close()
4 a 追加
a 是在后面追加新的
写的时候需要自己手动换行 f = open("美女名单",mode="a",encoding="utf-8") f.write("\nlx\n") f.write("yt") f.flush() f.close()
5 处理非文本文件用 rb wb ab , b 是 bytes mode 里如果有b , encoding= 就不用写了
格式:
f = open("路径",mode = " *b")
f = open("c:/pdd.jpg", mode="rb") # 这里不能写encoding e = open("e:/pdd.jpg", mode="wb") for line in f: # 从c盘读取 line你是不知道读取了多少数据的 e.write(line) # 写入到e盘 f.close() e.flush() e.close()
二 带+的 r+ w+ a+
不论你读取了多少内容,光标在哪,写入的时候都是在结尾写入,除非上来就写入,这时写入是在开头
最好用的读写是同时存在的模式
r+ 读写模式 先读后写
w+ 写读模式 先写后读
1 r+
f = open("阿西吧", mode="r+", encoding="utf-8") s = f.read(3) # 读取三个字符 print(s) f.write("不养了. 送人") # 在末尾写 f.write("葫芦娃") s = f.read() print(s) s = f.read(2) print(s) f.write("还有何云伟") f.close()
2 w+
很少用. 因为会清空文件中的内容 f = open("阿西吧", mode="w+", encoding="utf-8") f.write("张云雷也要退出德云社") # 写完之后光标在最后. 读取是没有内容的 f.seek(0) # 移动光标, 移动到开头 s = f.read() print("读取的内容是",s) f.flush() f.close()
3 a+
f = open("阿西吧", mode="a+", encoding="utf-8") f.write("我要加入德云社") f.seek(0) #将光标移到最前面 s = f.read() print(s) f.flush() f.close()
三 文件相关操作
f = open("阿西吧", mode="r", encoding="utf-8") for i in f: print(i.strip()) f = open("阿西吧",mode="r",encoding="utf-8") f.seek(3) # 光标向右移动三个字节 for i in f: print(i) s = f.seek(1) #读取一个字符 print(s) f.tell() #查询光标在哪 f.close()
seek()
格式:
seek(偏移量,位置)
seek(0) # 开头
seek(0,2) # 在末尾的偏移量是0 末尾
seek(0,1) #偏移量为0 在当前位置
truncate()
从文件开头截断到光标位置
如果给参数,从头截断到参数位置
f = open("你妹的",mode="w",encoding="utf-8") s = f.write("好好学习不行吗,非要玩游戏") f.seek(9) print(f.tell()) #光标当前位置 f.truncate(21) #截取21个字节 7个字 utf-8编码格式 f.close()
tell()
查询光标在那个位置
三 文件的修改
模块的引用 import
with 打开文件 后面可以不用关文件
格式: with open ("路径",mode=" r(读)",encoding= "编码格式") as 返回值 ,/(换行) open("路径副本",mode="w(写)",encoding= "编码格式") as 返回值1
例如:
import os with open("歌曲菜单.txt",mode="r",encoding="utf-8") as f, \ open("歌曲菜单-副本.txt",mode="w",encoding="utf-8") as f1: for i in f: i = i.replace("嘟嘟","哈哈") f1.write(i) os.remove("歌曲菜单.txt") #删除 os.replace("歌曲菜单-副本.txt","歌曲菜单.txt") # 将副本更名为新列表
将文本中的内容一列表的形式展现出来
例如: 不太理解
import os
with open("2018-08-06.log", mode="r", encoding="utf-8") as f: first = f.readline().strip().split(",") for line in f: dic = {} # 每一行一个字典 # 1,alex,10086,特斯拉 ls = line.strip().split(",") for i in range(len(first)): dic[first[i]] = ls[i] lst.append(dic) print(lst)