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

    1 .只读(r)

    # 路径有两种:
    #   1. 相对路径, 相对于你当前程序所在的文件夹.(必须掌握)
    #    ../ 返回上一层目录
    #    相对的是当前程序所在的文件夹
    #   2. 绝对路径. 1.从磁盘根目录寻找. 2.互联网上的一个绝对路路径
    f = open("歌姬",mode="r",encoding="utf-8")    #f相当于一个句柄
    s = f.read()
    f.close()                                      #打开以后记得关闭
    print(s)
    

      只读(rb)

    f = open("歌姬",mode="rb")                #读取的内容直接是字节
    bs = f.read()                              #b'xe5xa4xa7xe7x9cxbcxe5x93xa5,xe5xa4xa9xe5xa4xa9'
    print(bs)
    print(bs.decode("utf-8"))                 #需要解码
    f.close()
    

    2. 只写(w):写的时候注意. 如果没有文件. 则会创建文件, 如果文件存在. 则将原件中原来的内容删除, 再 写入新内容.

    f = open("宿舍",mode="w",encoding="utf-8")            #写入之前会清掉原来的内容
    f.write("小白梨")
    f.flush()
    f.close()
    

      只写(wb)

    f = open("歌姬",mode="wb")              #读取的内容直接是字节
    f.write("你不好吃".encode("utf-8"))
    f.close()
    

    3. 追加(a): 在追加模式下. 我们写入的内容会追加在文件的结尾.

    f = open("歌姬",mode="a",encoding="utf-8")            #在原来的基础上追加内容
    f.write("小龙女")
    f.flush()
    f.close()
    

    4读写(r+): 先将所有的内容清空. 然后写入. 最后读取. 但是读取的内容是空的, 不常用.

    f = open("梨",mode="r+",encoding="utf-8")     #r+模式,默认情况下光标在文件的开头,必须先读后写
    s = f.read()
    f.write("周润发")
    f.flush()
    f.close()
    print(s)
    

     在读写模式下,如果没有进行任何操作,直接写入,在开头写入.;只要进行读操作,在末尾处添加写的内容

    f = open("梨", mode="r+", encoding="utf-8")
    s = f.read(3)
    print(s)
    # 不管你前面读了几个. 后面去写都是在末尾
    f.write("哈哈")   # 1.在没有任何操作之前进行写. 在开头写  2. 如果读取了一些内容. 再写, 写入的是最后
    

    5.写读(w+)

    f = open("梨",mode="w+",encoding="utf-8")          #w操作会清空原来的内容.w+是不用的
    f.write("今天天气")
    f.seek(0)
    s = f.read()
    print(s)
    f.flush()
    f.close()
    

    6. 追加读(a+):a+模式下,不论是先读还是后读,都是读不到数据的.

    f = open("梨",mode="a+",encoding="utf-8")
    f.write("黄鹂")
    s = f.read()
    print(s)
    f.flush()
    f.close()
    

    7 .光标移动

    f = open("精品", mode="r+", encoding="utf-8")
    f.read(3)
    f.seek(3)   # 移动到xx位置
    移动到开头: f.seek(0)  开头
    移动到末尾: f.seek(0, 2)   末尾 第二个参数有三个值. 0: 再开头,  1: 在当前, 2: 末尾
    

      f.seek()   seek里的参数移动的是字节

    f.seek(6)   # 移动6个字节. 2个字
    s = f.read(3)   # 读取3个字
    print(s)
    f.seek(0)
    ss = f.read(3)
    print(ss)
    

    8 .文件内容修改

      文件修改: 只能将文件中的内容读取到内存中, 将信息修改完毕, 然后将源文件删除, 将新文件的名字改成老文件的名字.

    import os
    with open("../er,",mode="r",encoding="utf-8")as f1,open("../er_副本",mode="w",encoding="utf-8")as f2:
        s = f1.read()
        ss = s.replace("肉", "菜")
        f2.write(ss)
    os.remove("er")
    os.rename("er_副本","er")
    

       弊端: ⼀次将所有内容进行读取. 内存溢出      解决方案:⼀行一行的读取和操作

    import os
    with open("../er,",mode="r",encoding="utf-8")as f1,open("../er_副本",mode="w",encoding="utf-8")as f2:
        for line in f1:
            s = line.replace("肉","菜")
            f2.write(s)                 #一定要缩进,不要和f2对其.
       f2.flush()
       f2.close()
    os.remove("er") os.rename("er_副本","er")

    9 .truncate()截断

    #火锅鸭血粉丝汤
    f = open("梨小",mode="r+",encoding="utf-8")
    f.seek(12)
    # f.truncate()            #truncate()不给参数,从文件头截取到当前位置  火锅鸭血
    f.truncate(15)            #truncate()给了参数,从文件头截取到你给这个参数的位置
    f.flush()
    f.close()
    

    10. 判断文件是否可读

    f = open("亵渎", mode="r", encoding="UTF-8")
    # 如何判断这个文件可以进行什么操作
    # print(f.readable()) # 判断文件是否可读
    # print(f.writable()) # 是否可写入
    

    11. readlines:

      readlines()将一行形成一个元素, 放到一个列表中. 将所有的内容都读取出来. 所以也是容易出现内存崩溃的问题.不推荐使用.

    f = open("梨",mode="r",encoding="utf-8")
    lst = f.readlines()                  #拿到列表
    for s in lst:
        ss = s.strip()                   #去掉空格,还可以去掉换行符,制表符
        print(ss)
    f.flush()
    f.close()
    

    12. 循环读取.这种方式是最好的,每次读取一行内容,不会产生内存溢出的问题.

    f = open("梨",mode="r",encoding="utf-8")
    for line in f:
        print(line.strip())
    f.close()
    

    13. strip():可以去掉空格,还可以去掉换行符,制表符

    s = "	哈哈哈"
    print(s.strip())                  #	就是tab键
    

    14. 例题:

    文件内容a1.txt:

    序号   部门  人数  平均年龄  备注

    1    python  30  26    单身狗

    2    linux   26  30    没对象

    3    运营部  20  20    女生多

    通过代码实现,将其构建成这种模型:

    [{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'},......]

        f = open("liu", mode="r", encoding="utf-8")
        line = f.readline()
        lst = line.split()  # 第一行切割完成 key就准备完了
        result = []
        # 接着向后读取
        for lin in f:
            ll = lin.split()    # 每一行都进行切割
            dic = {}
            for i in range(len(ll)):    # i 表示ll的索引
                # lst[i]    # key
                # ll[i]        # value
                dic[lst[i]] = ll[i]
            result.append(dic)
        print(result)
    

      

    
    

      

     

      

  • 相关阅读:
    《使用Hibernate开发租房系统》内部测试笔试题
    C++第十课 字符串
    【011】字符数组
    C++第九课 数组
    C++第八课 局部变量和全局变量
    【010】递归函数
    C++第七课 函数2
    【009】阅读代码
    C++第六课 函数1
    【008】查找素数
  • 原文地址:https://www.cnblogs.com/gyh412724/p/9295984.html
Copyright © 2011-2022 走看看