zoukankan      html  css  js  c++  java
  • 文件操作 mode:r w a ... 文件句柄 文件修改(重点,难点)

    文件操作

    open 打开
    f = open(文件路径, mode="模式", encoding="编码格式")     最最底层操作的就是bytes
    打开一个文件的时候获取到的是一个文件句柄.

    文件路径:

    绝对路径
    从磁盘根目录开始寻找
    相对路径
    相对于当前程序所在的文件夹
    ../ 上一层文件
    文件夹/ 进入xxx文件夹

    1. 相对路径: 相对于当前程序所在的文件夹, 如果再文件夹内. 随便找. 直接写名字
     如果不在这个文件夹内. 可能需要出文件夹或者进文件夹
     出文件夹 ../
     进文件夹 文件夹/
     2. 绝对路径: 从磁盘根目录寻找路径 (有问题)
    只有在记录日志的时候可以用到绝对路径
     日志: 程序运行过程中记录的信息.

    mode

    r:

    r: 读取,只读.
    读取文件的相关操作
    1. read()
    默认: 读取文件内容(全部)
    read(n) 读取n个字符
    2. readline() 读取一行
    3. readlines() 读取全部. 返回列表
    (最重要)4. for line in f: 每次读取一行内容

    f = open("alex和wusir的故事", mode="r", encoding="utf-8")
    # 读取内容
    content = f.read() # 全部都读取出来
    print(content)

    f = open("小护士模特主妇萝莉.txt", mode="r", encoding="utf-8")
    print(f.read(5))  # 读取5个字符
    print(f.read(5))  # 继续读5个
    
    print(f.readline().strip()) # 换行符为分割, strip()可以去掉换行. 读取到的内容第一件事就是去掉空白
    print(f.readline()) # 换行符为分割
    f.close()#  关闭连接
    
    print("周润发", end="胡辣汤")#打印以"胡辣汤"结尾或者说最后加上"胡辣汤" print("周星驰") print(f.readlines()) # 一次性把文件中的内容读取到列表中. print("你叫什么名字? 我叫李嘉诚. 可能") # 换行 print("你叫什么名字?\n 我叫李嘉诚. 可能") # 显示 print("你叫什么名字?\\n 我叫李嘉诚. 可能") # 显示 \n 文件句柄是一个可迭代对象 优点: 相对来说节省内存, 操作相对简单 for line in f: # 从文件中读取到每一行给前面的line print(line.strip()) f.close()

    w:

    写入. 只写
    创建文件
    会清空文件

    # 每次用w模式打开文件, 都会清空这个文件(坑)
    f = open('胡辣汤', mode="w", encoding="utf-8") # 可以帮我们创建文件
    
    f.write('河南特色
    ')
    f.write("东北特色
    ")
    f.write('陕西特色
    ')
    
    # 好习惯
    f.flush()  # 刷新管道, 把数据写入文件
    f.close()   #关闭管道

    a:
    追加写

    也可以创建文件,当文件名不存在就创建一个文件

    f = open("葫芦小金刚", mode="a", encoding="utf-8") # a, append 追加, 在文件的末尾写入内容
    # f.write("你叫什么名字啊?")
    # f.read() # not readable   光标在末尾,所以读不到
    f.flush()
    f.close()

     

    对于文件而言. 应该有的操作就两个:读, 写
    r+:

    读写操作
    w+:
    写读操作
    a+:
    追加写读

    #"r+"操作演示
    f = open("葫芦小金刚", mode="r+", encoding="utf-8") content = f.read(2) # 顺序必须先读, 后写 # r+特有的深坑:不论读取内容的多少. 只要你读了. 写就是在末尾 f.write('五娃') print(content)

    #"w+"操作演示
    #
    一上来会清空文件. 没人用 f = open("葫芦小金刚", mode="w+", encoding="utf-8") # content = f.read(2) # 顺序必须先读, 后写 # # r+特有的深坑:不论读取内容的多少. 只要你读了. 写就是在末尾 # f.write('五娃') f.write("又能吐火的, 有能吐水的.") # 移动光标 f.seek(0) # 移动到开头 s = f.read() print("=========>", s)
    "a+"操作演示
    追加写读, 光标在末尾. 所有的写都是在末尾 f
    = open("葫芦小金刚", mode="a+", encoding="utf-8") f.write("机器葫芦娃召唤神龙, 高喊.我代表月亮消灭你!") f.seek(0) s = f.read() print("=========>", s)

     r+

    对于读写模式. 必须是先读. 因为默认光标是在开头的. 准备读取的. 当读完了了之后再进⾏行行 写入. 我们以后使⽤用频率最⾼高的模式就是r+ 正确操作是

    w+

    有⼈人会说. 先读不就好了了么?

    错. w+ 模式下, 一开始读取不到数据. 然后写的时候再将原来
    的内容清空. 所以, 很少⽤.

     a+

    还有一些其他的带b的操作. 就不多赘述了了. 就是把字符换成字节. 仅此⽽而已,比如r+b w+b a+b

    seek  和  tell

     1. seek(n) 光标移动到n位置, 

    注意, 移动的单位是byte. 所以如果是UTF-8的中⽂文部分要 是3的倍数.       

    通常我们使⽤用seek都是移动到开头或者结尾.         

    移动到开头: seek(0)       

    移动到结尾: seek(0,2) 

    seek的第⼆个参数表示的是从哪个位置进行偏移, 默认是0,  表示开头, 1表⽰示当前位置, 2表⽰示结尾

    f = open("胡辣汤", mode="r+", encoding="utf-8")
    f.seek(0,2) # 移动到末尾
    content = f.read(5)
    print(content)
    f.seek(0) # 移动到开头
    print(f.read())
    print(f.tell())  # 字节

    2. tell() 使⽤用tell()可以帮我们获取到当前光标在什什么位置

     文件的修改(重点  难点)

    例如: 修改文件的操作

    #存在文件"夸一夸alex"


    #
    需求: 把好人换成sb # 必须: # 1. 先从文件中读取内容 # 2. 把要修改的内容进行修改 # 3. 把修改好的内容写人一个新文件 # 4. 删除掉原来的文件 # 5. 把新文件重命名成原来的文件的名字 # 导入os模块 os表示操作系统 import os # f = open("夸一夸alex", mode="r", encoding="utf-8") # f2 = open("夸一夸alex_副本", mode="w", encoding="utf-8") # with会自动的帮我们关闭文件的链接 with open("夸一夸alex", mode="r", encoding="utf-8") as f, open("夸一夸alex_副本", mode="w", encoding="utf-8") as f2: for line in f: if "好人" in line: line = line.replace("好人", "sb") f2.write(line) # time.sleep(3) # 程序暂停3秒 # 删除原来文件 os.remove("夸一夸alex") # 重命名副本为原来的文件名 os.rename("夸一夸alex_副本", "夸一夸alex")

     

     

     

  • 相关阅读:
    牛客练习赛51 D题
    Educational Codeforces Round 72 (Rated for Div. 2) C题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) C题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) A题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) A题
    Educational Codeforces Round 72 (Rated for Div. 2) B题
    Educational Codeforces Round 72 (Rated for Div. 2) A题
    《DSP using MATLAB》Problem 7.2
    《DSP using MATLAB》Problem 7.1
    《DSP using MATLAB》Problem 6.24
  • 原文地址:https://www.cnblogs.com/H1050676808/p/10071724.html
Copyright © 2011-2022 走看看