Python7

文件操作

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)) #"{}{}",错的,格式化解决两个字符问题,且注意不用逗号用顿号;换行符\n
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

 

  

 

posted @ 2018-10-18 18:25  Bree-No1  阅读(284)  评论(0编辑  收藏  举报