• 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("{}
    {}".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

      

  • 相关阅读:
    [网络流24题]飞行员配对方案问题
    学习笔记——线性基
    HDU 4507 吉哥系列故事——恨7不成妻(数位DP求平方和)
    bzoj1415&洛谷P4206 [NOI2005]聪聪与可可
    后缀自动机(模板+例题)
    最小表示法(模板)poj1059
    求次小生成树(洛谷P4180&bzoj1977)
    KMP poj3942
    最小表示法(模板) CH1807
    数位dp 求山峰数(hill)
  • 原文地址:https://www.cnblogs.com/zll-52011/p/9780380.html
Copyright © 2020-2023  润新知