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)
    

      

    
    

      

     

      

  • 相关阅读:
    每天一道LeetCode--141.Linked List Cycle(链表环问题)
    每天一道LeetCode--119.Pascal's Triangle II(杨辉三角)
    每天一道LeetCode--118. Pascal's Triangle(杨辉三角)
    CF1277D Let's Play the Words?
    CF1281B Azamon Web Services
    CF1197D Yet Another Subarray Problem
    CF1237D Balanced Playlist
    CF1239A Ivan the Fool and the Probability Theory
    CF1223D Sequence Sorting
    CF1228D Complete Tripartite
  • 原文地址:https://www.cnblogs.com/gyh412724/p/9295984.html
Copyright © 2011-2022 走看看