• 文件操作


    encode:编码

    decode:解码

     encoding="utf-8" :只手一种编码方式,并不是像encode,decode的功能一样,而"utf-8"依赖于文件是以什么方式创建的,以什么方式打开的,

    如:记事本是GBK方式创建的,则打开需用GBK编码方式打开,encoding="GBK"

    文件名最好以英文命名,不然会在某个环节出错,以什么编码方式存储的,就以什么编码方式打开.

    路径问题:

    绝对路径:从根目录开始,一级一级查找直到找到文件.eg:D:\....

    相对路径:在同一个文件下(目录)直接写文件名. eg:具体的文件名

    一:  读文件模式:    r  , 默认可以不写,mode="r".   读取出来都为str类型.五种模式

    1.全部读出来.f.read()

    f = open("log", encoding="utf-8", mode="r")   #注意 = 旁边无空格
    content = f.read()
    print(content)
    f.close()

    #全部读出来

    2.读取一部分,按照字符去读取.(也可以理解为个数)  f.read(n)

     文件打开方式为文本模式时,代表读取5个字符

    文件打开方式为b模式时,代表读取5个字节

    f = open("log", encoding="utf-8", mode="r")   #注意 = 旁边无空格
    content = f.read(5)
    print(content)
    f.close()
    #返回:1.输入工

    3.一行一行的读.f.readline().

    f = open("log", encoding="utf-8", mode="r")   
    print(f.readline())
    print(f.readline())
    print(f.readline())              #读多行             
    f.close()
    #返回:1.输入工资 判断是不是整数

    4.一行一行的读.将原文件的每一行作为一个列表的元素.  f.readlines()

    f = open("log", encoding="utf-8", mode="r")   #注意 = 旁边无空格
    content = f.readlines()
    print(content)
    f.close()
    #返回:['1.输入工资
    ', '判断是不是整数
    ', '将输入的变为int类型
    ', '..

    5.循环读取   推荐使用的方法,因为在内存中永远只占一行

    f = open("log", encoding="utf-8", mode="r")
    for i in f:               # i就是每一行
        print(i.strip())      #  strip()去掉隔行符
    f.close()           
    #将文件全部读取出来

    二.写 w 没有文件,创建一个文件写入内容,有文件,将原文件内容清空,在写入内容.(所以有弊端,容易将之前的内容清楚掉不好)

    f = open("log", encoding="utf-8", mode="w")
    f.write("今天开班会")
    f.close()
    返回:在log文件夹内就可以找到写进去的内容

    三,读写模式:   r+ 先读,后追加,一定要先读后追加

    f = open("log", encoding="utf-8", mode="r+")
    content = f.read()       #比如之前文件里的内容为:今天开班会
    f.write("AAA")           #读完之后再写入AAA
    print(content)           #最后再打印
    f.close()
    with open("log1", encoding="utf-8", mode="r+")as f:
        content = f.read()
        f.write("AAA")
        f.read()
        print(content)

    四,写读模式  w+ 先写后读

    f = open("log", encoding="utf-8", mode="w+")
    f.write("中国")
    print(f.read())
    print(f.tell())             #按照字节去读光标的位置
    f.seek(3)                   #按照字节调整光标位置
    print(f.read())
    f.close()
    #返回:6  国

    其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate

    seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

     

    with open("log1", encoding="utf-8", mode="w+")as f2:
        f2.write("今天在家学习")
        f2.tell()
        f2.seek(6)
        print(f2.read())

    五.追加 a 没有文件创建一个文件追加内容,有文件直接追加内容.

    f = open("log1", encoding="utf-8", mode="a")
    f.write("666") #创建一个新的以log1命名的新文件,内容为666
    f.close()

    六.以bytes类型,进行的读, 写,文件操作以bytes类型写入就需转成bytes类型后再写入.非文件的文件是用rb读取,什么是非文件比如视频,图片.

    只举一种写的例子:

    f = open("log", mode="wb")
    f.write("老男孩".encode("utf-8"))        #中文的字符串转换成bytes类型,就需encode(utf-8),转换一下

    f.close() #返回:在文件夹log中,写入了老男孩

    七.其他方法:truncate   按字节对原文件截取.

    一,truncate是截断文件,所以文件的打开方式必须可读,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
    f = open("log1", encoding="utf-8", mode="a")
    f.truncate(2)
    f.close()

    二,自动关闭文件句柄  with open

    #功能一,省去自动关闭文件句柄
    with open("log1",encoding="utf-8",mode="r") as f: #
        print(f.read())
    #功能二,省去自动关闭文件句柄,利用一个位置去操作多个文件句柄
    with open("log1", encoding="utf-8", mode="r") as f1,
         open("log2", encoding="utf-8", mode="w") as f2:
        print(f1.read())
        print(f2.write("hahhah"))        #可以用任意模式去操作.可以r,w.a

     

    八,文件修改,实际操作

    1.将源文件读取到内存

    2.在内存中进行修改,形成新的字符串(文件 )

    3.将新的字符串写入新文件

    4.将原文件删除

    5.将新文件重命名成原文件

     例题:有如下文件:

    -------

    alex是老男孩python发起人,创建人。

    alex其实是人妖。

    谁说alex是sb?

    你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。

    ----------

    将文件中所有的alex都替换成大写的nb。

    import os     #引用模块
    
    with open("log1", encoding="utf-8", mode="r") as f,              #以读模式打开原文件
        open("log1.back", encoding="utf-8", mode="w") as f2:  #以写的模式打开log1.back文件
        content = f.read()         #将读的文件赋给一个变量,不能每次都写f.read()
        new_content = content.replace("alex", "nb") #通过旧文件用replcae方法将alex修改为nb,赋值给新的文件
        f2.write(new_content)           #将新的写入f2中,即log1.back的文件中
    
    os.remove("log1")#将原来的文件(log1)删除
    os.rename("log1.back", "log1")  #重新命名为log1

    #但求理解,即使是初级版本,也必须是要理解的.
    高级版本写法:
    import os
    
    with open("log1", encoding="utf-8", mode="r") as f,
        open("log1.back", encoding="utf-8", mode="w") as f2:
        for i in f:
            new_i = i.replace("nb", "alex")
            f2.write(new_i) #这里不能加引号,加引号就是写进去单个字符串,而不是将修改过后的文件new_i写进去
    
    os.remove("log1")
    os.rename("log1.back", "log1")

     

  • 相关阅读:
    Delphi 2005 以上版本GIF动画播放设置
    WIN7中盾牌的编程-DELPHI
    Delphi中ComPort通信中的数据处理
    【ZJOI2008】树的统计(树链剖分)
    【CJOJ2440】大话西游(树链剖分)
    【洛谷3384】【模板】树链剖分
    【NOI2004】郁闷的出纳员(splay)
    【HNOI2004】宠物收养所(splay)
    【HNOI 2002 】营业额统计(splay)
    【Tyvj 1728】普通平衡树
  • 原文地址:https://www.cnblogs.com/sunny7/p/8878907.html
Copyright © 2020-2023  润新知