zoukankan      html  css  js  c++  java
  • day08

    1. 文件操作简介

    使⽤python来读写⽂件是非常简单的操作. 我们使⽤open()函数来打开⼀个⽂件, 获取到⽂件句柄. 然后通过⽂件句柄就可以进⾏各种各样的操作了. 根据打开⽅式的不同能够执⾏的操作也会有相应的差异. 
    打开⽂件的⽅式: r, w, a, r
    +, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使⽤的是r(只读)模式

    2. 文件操作

    1. 绝对路径和相对路径
        (1) 绝对路径:从磁盘根⽬录开始⼀直到⽂件名. 
        (2) 相对路径:同⼀个⽂件夹下的⽂件. 相对于当前这个程序所在的⽂件夹⽽⾔. 如     
            果在同⼀个⽂件夹中. 则相对路径就是这个⽂件名. 如果在上⼀层⽂件夹. 则要../

        注意: 我们更推荐⼤家使⽤相对路径. 因为在我们把程序拷⻉给别⼈使⽤的时候. 直接把项⽬拷⻉走
        就能运⾏. 但是如果⽤绝对路径. 那还需要拷⻉外部的⽂件.

    2. r 只读
        f = open("护⼠少妇嫩模.txt",mode="r", encoding="utf-8")
        content = f.read()  # 把读取到的东西赋值给content
        print(content)
        f.close()  # 关闭句柄
    
        # 句柄可以迭代
        f = open("吃的",mode="r",encoding='utf-8')
        for line in f:  # 每次读取一行,赋值给前面的line变量
            print(line)
        f.close()   # 关闭句柄
    3. w 只写
       # w 操作 会清空原来的所有内容 f
    = open("⼩娃娃", mode="w", encoding="utf-8") f.write("⾦⽑狮王") f.flush() # 刷新管道,防止残余 f.close() # 关闭句柄
    4. a 追加
        # 在原来的基础上进行追加 内容
        f = open("小护士模特",mode="a",encoding="utf-8")   
        f.write("小龙女")
        f.flush()
        f.close()
    5. r+ 读写(使用最多,重难点)
        # r+模式, 默认情况下光标在文件的开头, 必须先读后写.
        注意:
            1.在没有任何操作之前, 在开头写.
            2. 如果读取了一些内容,再写,写入的是最后.    
    6. w+ 写读
       # w 操作,会清空原来的内容. w+一般是不用的
        f = open("亵渎",mode="w+",encoding="utf-8")  
        f.write("今天天气")
        f.seek(0)   # 移动光标  移动到xxx位置
        s = f.read()  # 写完后光标在最后面,想要读必须把光标移到前面
        print(s)
        f.flush()
        f.close()
    7. a+ 追加写,然后读
        f = open("亵渎",mode="a+",encoding="utf-8")
        f.write("你在哪里啊")
        f.flush()  # 刷新通道
        f.seek(0)  # 追加写完后,光标位置在最后,需要移到最前面,才能读
        s = f.read()  # 把读取到的内容给s
        f.close()  # 关闭句柄
        print(s)    
    8. b
         rb, wb, ab, r+b, w+b, a+b
        b: 输入输出的是字节. 处理非文本.

    3. read详解(读取文件的方法)

        # 1. read() 将⽂件中的内容全部读取出来. 弊端: 占内存. 如果⽂件过⼤.容易导致内 
        存崩溃 
        f = open("../def/哇擦.txt", mode="r", encoding="utf-8")
        content = f.read()
        print(content)
    
        # 2. read(n) 读取n个字符. 需要注意的是. 如果再次读取. 那么会在当前位置继续去 
        读⽽不是从头读, 如果使⽤的是rb模式. 则读取出来的是n个字节
        f = open("../def/哇擦.txt", mode="r" encoding="utf-8")
        content = f.read(3)
        print(content)
    
        # 3. readline() ⼀次读取⼀⾏数据, 注意: readline()结尾, 注意每次读取出来的 
        数据都会有⼀个
     所以呢. 需要我们使⽤strip()⽅法来去掉
    或者空格
        f = open("../def/哇擦.txt", mode="r", encoding="utf-8")
        content = f.readline()
        content2 = f.readline()
        content3 = f.readline()
        print(content)
        print(content2)
        print(content3)
    
        # 4. readlines()将每⼀⾏形成⼀个元素, 放到⼀个列表中. 将所有的内容都读取 
        出来. 所以也是容易出现内存崩溃的问题.不推荐使⽤
        f = open("../def/哇擦.txt", mode="r", encoding="utf-8")
        lst = f.readlines()
        print(lst)
        for line in lst:
        print(line.strip())
        
        # 5. 循环读取. 这种⽅式是最好的. 每次读取⼀⾏内容.不会产⽣内存溢出的问题.
        f = open("../def/哇擦.txt", mode="r", encoding="utf-8")
        for line in f:
        print(line.strip())
    
        注意: 读取完的⽂件句柄⼀定要关闭 f.close()

    4. 其他相关操作

    1. seek() 移动光标
        # 文件的操作读写追加等,其实都是靠光标的移动才能完成.
        # 光标在哪里,才能从哪里开始读,从哪里开始写.
        但 r+ ,是一个例外.
        r+ :
             1.在没有任何操作之前, 在开头写(这个是正常的,因为光标最开始就在开头)
             2. 如果读取了一些内容,再写,写入的是最后(这个是例外,因为正常情况下光标在哪里就应该从哪里开始写,但是这里是在最后写.)
    
        # 移动到开头: f.seek(0)  开头
        #  f.seek(xx)  移动到第XX个字节
    
        # 第二个参数有三个值. 0: 在开头  1: 在当前  2: 末尾
        # 移动到末尾: f.seek(0, 1)  当前
        # 移动到末尾: f.seek(0, 2)  末尾
    
    2. tell()
        #  使⽤tell()可以帮我们获取到当前光标在什么位置
        f = open("⼩娃娃", mode="r+", encoding="utf-8")
        content = f.read()
        print(content)
        print(s.tell())
        
        深坑请注意: 在r+模式下. 如果读取了内容. 不论读取内容多少. 光标显⽰的是多 
        少. 再写入或者操作⽂件的时候都是在结尾进⾏的操作. 
    
    3. truncate() 截断⽂件
        f = open("⼩娃娃", mode="w", encoding="utf-8")
        f.write("哈哈") # 写⼊两个字符
        f.seek(3) # 光标移动到3, 也就是两个字中间
        f.truncate() # 删掉光标后⾯的所有内容
        f.close()
    
        # 如果想做截断操作. 记住了. 要先挪动光标. 挪动到你想要截断的位置. 然后再进⾏截断.
        # 关于truncate(n), 如果给出了n. 则从开头开头进⾏截断, 如果不给n, 则从当前位置截断. 后⾯的内容将会被删除    

    5. 修改⽂件以及另⼀种打开⽂件的⽅式

    import os
    
    with open("吃的",mode="r",encoding="utf-8") as f1,
          open("吃的_副本",mode="w",encoding="utf-8") as f2:
        # s = f1.read()
        # ss = s.replace("肉","菜")
        # f2.write(ss)
        # 弊端: ⼀次将所有内容进⾏读取. 内存溢出. 
        # 解决⽅案: ⼀⾏⼀⾏的读取和操作
        for line in f1:
            s = line.replace('','')
            f2.write(s)
    os.remove("吃的")  # 删除模块
    os.rename("吃的_副本","吃的")  # 重命名文件
  • 相关阅读:
    c/c++混编
    inotify监听文件
    二维数组
    CentOS7 修改系统时间
    书签书签
    c语言并行程序设计之路(四)(barrier的实现和条件变量)
    MPI分布式内存编程(一):预备知识
    有些狮子不喝咖啡:条件式与合取式的翻译
    【部分博客已搬家至博客园】对CSDN、博客园和简书的一点比较
    c语言并行程序设计之路(三)(信号量与同步)
  • 原文地址:https://www.cnblogs.com/kangqi452/p/11286771.html
Copyright © 2011-2022 走看看