文件操作
a.txt
1.文件路径:d:a.txt
2.编码方式:utf-8,gbk...
3.操作方式:只读,只写,追加,读写,写读...
4.以什么编码方式储存的就用什么编码方式打开,不然会报错。
#绝对路径,从根目录开始算,相对路径即就在当前文件下的文件路径。
f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
1. 打开文件,得到文件句柄并赋值给一个变量 f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r #2. 通过句柄对文件进行操作 data=f.read() #3. 关闭文件 f.close()
f=open(r"G:a.txt",mode="r",encoding="gbk") content=f.read() print(content) f.close() #open函数在路径前面要加r或者R #这是使用原始字符串特性,即在字符串的前面已R或者小写字母r开始,则字符串不对进行转移,直接输出,通常用于表示windows的路径。
对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式),
以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码。
mode中带b 的不常用,后面不用再加encoding,内容是bytes,一是用在打开非文字类文件的读取查看,如图片,二是用在上传下载。
只读:r(内容是字符串类型);rb
只写:w 没有此文件就创建文件,若有原文件,则先删除文件内容,再写。
wb 不用写编码方式,本身就是bytes类型,只是在写文件内容的时候要转化编码方式。
f=open("be",mode="wb") #相对路径 f.write("fghjk".encode("utf-8")) #注意转码的写法,不要跟encoding="utf-8"混淆 f.close()
追加:a ; ab ; a+
f=open("be",mode="a",encoding="utf-8") f.write("nh") f.close()
f=open("be",mode="ab")
f.write("nh".encode("utf-8")
f.close()
读写:r+ (最常用)
#先读后写 f=open("be",mode="r+",encoding="utf-8") print(f.read()) #只读除源文件的内容,后来加进去的内容直接加在文件里,读不出来, f.write("11") f.close() #先写后读,不要用这个写读!!!! f=open("be",mode="r+",encoding="utf-8") f.write("aaa") print(f.read()) #在源文件从头开始写(光标在头),会占用源文件原内容的字符,读出来是后面没占用的原文件内容,若占完了,则读出空白。 f.close()
r+b
f=open("be",mode="r+b") print(f.read()) f.write("11".encode("utf-8")) f.close()
w+ 依旧先清除再写,可以调光标。
w+b
以r+为例功能详解
f=open("be",mode="r+",encoding="utf-8") print(f.read(3)) #read读出来的都是字符,括号有数字表示读几个,没数字表示读全部 f.close() f=open("be",mode="r+",encoding="utf-8") f.seek(3) #seek是按字节去移光标的,utf-8一个中文3个字节. print(f.read()) #read读出来的都是字符 f.close() f=open("be",mode="r+",encoding="utf-8") f.seek(3) print(f.tell()) #时刻检测光标 f.close() f=open("be",mode="a+",encoding="utf-8") f.write("aaa") count=f.tell() f.seek(count-9) 9个字符,3个中文,9个英文 print(f.read()) f.close()
read(3):
1. 文件打开方式为文本模式时,代表读取3个字符
2. 文件打开方式为b模式时,代表读取3个字节
其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate
注意:
1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果。
f.readline() 一行一行读
f.readlines() 每一行当做列表中的一个元素,添加到list中。可用for循环打印出来。
f.truncate() 对源文件进行截取。
for line in f:
print(line) 要一行一行读,而不要全部读,你不知道文件有多大,分分钟崩掉。
有时候会忘了写f.close(),可用with
with open("be",mode="a+",encoding="utf-8") as f, open("be",mode="r+",encoding="utf-8") as f1: print(f.read()) #推荐使用,不需要f.close(),还可以打开多个文件
三次登录机会:
usename=input("请输入你要注册的用户名:") password=input("请输入注册密码:") with open("List of info",mode="w",encoding="utf-8") as f: f.write("{} {}".format(usename,password)) #"{}{}",错的,格式化解决两个字符问题,且注意不用逗号用顿号;换行符 print("恭喜你,注册成功") list=[] i=0 while i<3: usn= input("请输入你要注册的用户名:") psw= input("请输入密码:") with open("List of info",mode="r+",encoding="utf-8") as f1: for line in f1: list.append(line) if usn==list[0].strip() and psw==list[1].strip(): #strip 去换行符 print("登陆成功") break else: print("账号或密码错误") i+=1