操做系统给用户提供的操做硬盘的简单接口python
永久保存数据编码
相对路径:a.txt # 必须与当前py文件在同一级目录操作系统
绝对路径:E:\Python\练习代码\文件处理\a.txtcode
f = open('a.txt') f = open(r"E:\Python\练习代码\文件处理\a.txt")# 注意须要要用r防止转义 f.close()# 回收操做系统的资源
f:文件句柄接口
能够同时打开多个文件,with未执行完前读取文件读不出内存
with open(r'th.jpg',mode='rb')as rf,open('lixiaoran.png',mode='wb')as wf: with open("a.txt") as f:# as 的做用是将赋值给f with open(r'E:\Python\练习代码\文件处理\a.txt') as f:# 注意须要要用r防止转义
一、文件路径utf-8
二、指定处理模式资源
三、指定操做文本的字符编码encoding=“ ”rem
with open("a.txt", mode='rt',encoding='utf8') as f: print(f.writable()) print(f.readable()) print(f.read())
纯净模式字符串
一、r:(默认)只读模式
一、默认mode = "rt"时要指定操做文本的字符编码encoding=“ utf-8”
二、读出二进制字节mode = "rb" ,不要指定encoding
三、读取文件若是文件不存在,会报错
r模式下的内置方法:
f .read() :所有一次性读出来
f.readable():判断是否可读
f.readline() :执行一次读一行
f.readlines() :所有读出来,按照列表的形式把每一行做为元素读出来,而且把\n换行符也会一并读出
with open(r"E:\Python\练习代码\文件处理\as.txt", "r", encoding='utf-8') as f: print(f.read()) # print(f.readline())# 执行一次读一行 # print(f.readline()) # print(f.readline()) # print(f.readline()) # print(f.readline()) print(f.readlines())# 所有读出来,按照列表的形式把每一行做为元素读出来 with open("a.txt","rb") as f1: print(f1.read())
二、w:(慎用)只写模式
一、若是文件不存在则创建一个新的文件,若是文件存在则清空文件内容从新写入
二、只写一个"w"默认是”wt",写成二进制字节为"wb"
f.write():只能写一个字符串,而且会清空以前的文件内容
f.writable():判断是否可写
f.writelines():按照列表的形式,加数据到原文件中,也会清空原文件中数据 ,for + f.write()
with open("a.txt", "w", encoding='utf-8') as f: # f.write("你好,上海") f.writelines(["你好\n",'上海'])
三、a:只追加写
一、若是文件存在则在数据后追加数据
二、若是文件不存在会新建一个文件写入数据
with open("a.txt", "a", encoding='utf-8') as f: f.write("\n hello,上海")# \n是表示换行
+模式(了解)
都是可读可写的,而且保留自身原有的特性
一、r+:可读可写,可是写时没有文件不会建立新文件
二、w+:可读可写,无文件时会建立新的文件
三、a+:光标永远在最后追加读写
必须结合r,w,a模式下使用
一、t:text文本模式
只能针对文本文件,读写文件只能以字符串为单位,必定要指定encoding
二、b:bytes二进制模式
能够读写任意文件,是以bytes二进制为单位,不要指定encoding
with open(r"timg.jpg",mode="rb") as f1,open(r"小黄人.png",mode="wb") as f2: # xiao = f1.read() # f2.write(xiao) for xiao in f1: f2.write(xiao)
读写文本文件时,使用t模式自动帮咱们编码和解码了,可是其余格式的文件,必需要用b模式,需手动解码编码
f.seek(光标移动的位数相对偏移度,指定光标从何开始)
f.seek(offset,whence) offset: 相对偏移度 (光标移动的位数)针对的是字节 whence:指定光标位置从何开始 0:从文件开头(t模式下只能是0) 1:从当前位置 2:从文件末尾
t模式下只能指定0,若是指定一、2那光标移动位数只能是0,从文件头开始,
b模式下能够是0,1,2均可以使用
b模式下须要解码才能正常读出来
gbk中一个中文字符是2个字节,一个英文字符半角是1个字节,全角是2个字节
utf-8中一个中文字符是3个字节,一个英文字符是1个字节
with open(r'a.txt', mode="rb") as f: f.seek(6,0) print(f.read(3).decode("utf-8")) f.seek(6,1) print(f.read(6).decode("utf-8")) f.seek(-8,2) print(f.read(6).decode("utf-8")) with open(r'a.txt', mode="r",encoding="utf-8") as f: f.seek(6,0) print(f.read(1)) f.seek(0,1) print(f.read(1))
硬盘中的数据无法修改,更新都是新内容覆盖旧内容,内存中的数据能够修改
因此咱们修改数据都是将硬盘中的数据读到内存中进行修改
具体的两种方式:
一、将文件数据所有读到内存而后修改
优势:同一份数据只有一份进行修改
缺点:过多的占用内存空间
with open(r"a.txt",mode="rt",encoding="utf-8") as f1: data = f1.read() with open(r"a.txt",mode="wt",encoding="utf-8") as f2: data2 = data.replace("上海","DSH") f2.write(data2)
二、以读的模式打开,以临时文件写入,写入后将原文件删除,临时文件重命名
需调用os模块
优势:不会占用过多内存
缺点:文件修改中同一份数据存了两份
import os with open(r"a.txt",mode="rt",encoding="utf-8") as f1,\ open(r"b.txt",mode="wt",encoding="utf-8") as f2: for i in f1: f2.write(i.replace("DSH","大上海")) os.remove("a.txt") os.rename("b.txt","a.txt")