zoukankan      html  css  js  c++  java
  • 文件操作

    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")

     

  • 相关阅读:
    hdoj 2803 The MAX【简单规律题】
    hdoj 2579 Dating with girls(2)【三重数组标记去重】
    hdoj 1495 非常可乐【bfs隐式图】
    poj 1149 PIGS【最大流经典建图】
    poj 3281 Dining【拆点网络流】
    hdoj 3572 Task Schedule【建立超级源点超级汇点】
    hdoj 1532 Drainage Ditches【最大流模板题】
    poj 1459 Power Network【建立超级源点,超级汇点】
    hdoj 3861 The King’s Problem【强连通缩点建图&&最小路径覆盖】
    hdoj 1012 u Calculate e
  • 原文地址:https://www.cnblogs.com/sunny7/p/8878907.html
Copyright © 2011-2022 走看看