概述:文件的基本操作
1.open 打开文件
f = open("xxx",mode="r",encoding="utf-8") #常用形式 打开一个文件,获得文件句柄
f = open("E:\python\python work\day09\任天堂.txt",mode="r",encoding="utf-8")
content = f.read() # 一次性全部读取
content = f.readline() # 一次读取一行
content = f.readlines() # 一次性读取,并生成列表
f.close()
print(content)
f = open("xbox",mode="w",encoding="utf-8")
content = f.write("这是个什么鬼")
2.绝对路径,相对路径
1. 绝对路径(当文件路径是固定的时候)
从磁盘根目录找文件。 windows下用的就是c,d,e,f, linux: \user\bin\xxxx
2. 相对路径(用的多)
相对路径相对于当前程序所在的文件夹
../ 表示上一层文件夹
f = open("E:/python/python work/day09/任天堂.txt",mode="r",encoding="utf-8") #绝对路径
f = open("../day09/任天堂.txt",mode="r",encoding="utf-8") # 相对路径 用的较多
content = f.read()
f.close()
print(content)
注意:句柄f是一个可以迭代的对象,所以可以进行遍历操作
f = open("../day09/任天堂.txt",mode="r",encoding="utf-8")
for el in f: # 一行一行的读取,末端会有换行符/n 要清除掉
print(el.strip())
2.文件操作-mode的相关操作
2.1 r 只读
f = open("../day09/任天堂.txt",mode ="r",encoding="utf-8")
content = f.read() # 一次读完
content = f.read(3) #一次读两个字符(返回两个字)
f.write("haha") # 只能写不能读 会报错 not writable
f.close()
print(content)
2.2 w 只写
f = open("ps4.txt",mode ="w",encoding="utf-8") # w 如果文件不存在会重新创建一个新文件,假如存在会先清空该文件
f.write("啥玩意,一点也不好玩") #使用 w 要慎重
content = f.read() #只可以写不可以读 报错:not readable
f.close()
2.3 a 追加
f = open("ps4.txt",mode ="a",encoding="utf-8") # a模式下会在文件尾部写入相应字符
f.write("可是还想买啊")
content = f.read() ##仍然只可以写不可以读 报错:not readable
f.close()
print(content)
2.4 r+ 读加写
f = open("../day09/任天堂.txt",mode ="r+",encoding="utf-8")
content = f.read() # 可读可写,但因为光标的缘故,必须先读后写才能写在尾部,但注意 若先写会开头写入,并覆盖之前的东西
f.write("炸弹人")
content = f.read()
f.close()
print(content)
注意坑一 r+
坑: 不论你读取多少内容。再次写入的时候都是在末尾,不会因为光标在第三个字而在第三个字写入
f = open("../day09/任天堂.txt", mode="r+", encoding="utf-8")
info = f.read(3)
f.write("洛克人")
f.close()
print(info)
2.5 w+ 写加读
f = open("ps4.txt",mode ="w+",encoding="utf-8") # 依旧坑爹,打开就会清空文件
f.write("ps4没有swith一半好玩") #虽然可以读可是没什么卵用,读放在写之前,因为清空什么也读不到,
c = f.read() # 而在写完之后由于光标在末尾,也什么都读不到,需靠移动光标才能读
f.close()
print(c)
2.6 a+ 追加读写
f = open("../day09/任天堂.txt",mode ="a+",encoding="utf-8")
f.write("哼哼哈哈,马里奥网球") # a+ 无论光标在何处,都只会在末尾添加内容,并且一开始光标会在末尾,无论先读后读也读不到东西
c = f.read()
f.close()
print(c)
2.7 rb wb ab 之前的模式都是针对文本类型,而这三个主要针对非文本(图片视频等)的内容
形式
f = open(r"c:\胡一菲.jpg",mode ="rb") #不需要填写编码格式,因为非文本都是以Bytes为单位的,取和写入的是字节
需要你掌握的,因为图片一般都是粘贴复制为主,复制非文本的模式
把胡一菲从c盘复制到d盘, 单纯的从bytes角度来复制的。 适用于所有文件
f1 = open(r"c:\胡一菲.jpg", mode="rb")
f2 = open(r"d:\胡二非.jpg", mode="wb")
for line in f1: # 分批量的读取内容
f2.write(line) # open()出来的结果可以使用read或者write. 根据mode来看
f1.close()
f2.close()
2.8 r+b w+b a+b #其操作形式和r+ w+ a+基本一致,只是文本类型不一样罢了
3.光标 形式 f.seek(偏移量,(0,1,2)) 注意偏移量是以byte为单位的,不是一个字符
f = open("../day09/任天堂.txt",mode ="r",encoding="utf-8")
f.seek(0) # == f.seek(0,0) 光标移动到开头处
f.readline()
f.seek(0,1) # 光标移动到当前位置处,偏移量为0
f.seek(0,2) # 光标移动到结尾处
print(f.tell()) # f.tell() 可采集到目前光标的所在位置,但仍要注意是以Byte为单位的,unicode一个中文三个Byte
f.close()
3.1 truncate() 截断文件. 慎用
f = open("ps4.txt",mode ="w+",encoding="utf-8")
f.write("ps4没有swith一半好玩")
f.seek(6)
f.truncate() #截取到之前光标所在的位置,后面的不要
f.truncate(12) #不管前面光标在哪里,都从头开始截取到byte12的地方,剩下的不要
f.close()
4.文件修改
文件修改: 只能将文件中的内容读取到内存中, 将信息修改完毕, 然后将源文件删除, 将新文件的名字改成老文件的名字
import os
import time
f1 = open("ps4.txt",mode ="r+",encoding="utf-8")
f2 = open("ps4.txt_副本", mode="w", encoding="utf-8")
c = f1.readline()
f2.write(c.replace("ps4","xbox"))
f1.close()
f2.close()
time.sleep(3)
os.remove("ps4.txt")
time.sleep(3)
os.rename("ps4.txt_副本","ps4.txt",)
此处采用了新方法写open 好处是可以不用写 f.close()
import os # 引入操作系统
import time # 引入时间函数
with open("ps4.txt",mode ="r+",encoding="utf-8") as f1,\
open("ps4.txt_副本", mode="w", encoding="utf-8") as f2:
c = f1.readline()
f2.write(c.replace("ps4","xbox"))
time.sleep(3) #延迟三秒
os.remove("ps4.txt")
time.sleep(3)
os.rename("ps4.txt_副本","ps4.txt",)
4.文件操作的应用
lis = []
with open("水果批发.txt",mode="r",encoding="utf-8") as f1:
c = f1.readline().strip() #此处即可以提取出标题也可将光标更改至第二行,方便后面抓取数据
lis1 = c.strip().split(",") # 读取第一行 编号,名称,价格,库存数,产地
for el in f1: # 1,凤梨,20,5202,台湾,1
dic = {}
for i in range(len(lis1)):
dic[lis1[i]] = el.strip().split(",")[i] #项目与实际项目内容匹配
lis.append(dic) # 将字典加到列表中存储
print(lis)