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()结尾, 注意每次读取出来的 
    数据都会有⼀个\n 所以呢. 需要我们使⽤strip()⽅法来去掉\n或者空格
    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("吃的_副本","吃的")  # 重命名文件

 

posted @ 2019-08-02 09:45  magickang  阅读(120)  评论(0编辑  收藏  举报