Python7,,文件操作a.txt1


文件操作

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("{}\n{}".format(usename,password)) #"{}{}",错的,格式化解决两个字符问题,且注意不用逗号用顿号;换行符\nprint("恭喜你,注册成功")list=[]i=0while 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

  

Python7

评论关闭