python文件操作

1. 初识文件操作

  • 常规操作(太low:没缩进,还需要关闭,代码没有美感)

    f = open('path',mode='r',encoding='utf-8')
    f.read()
    f.close()
  • 进阶操作(高逼格:有缩进,不需要手动关闭)

    with open('path', 'r', encoding='utf-8')as f:
        f.read()

2. 只读(r, rb)

  • r模式

    # f 叫文件句柄. 我们通过这个句柄去操纵这个文件.
    f = open("21天学会python", mode="r", encoding="UTF-8")
    content = f.read()  # 从文件中读取到数据. 交给前面的content
    print(content)
    f.close()

    rb模式

    # rb 读取字节,除了是字节不用写编码方式其余一样的
    f = open("21天学会python", mode="rb")
    content = f.read()
    print(content)
    f.close()

3. 只写(w, wb)

  • w模式

    #下面这个栗子有点酸,明明是写模式,你非要读,请自行了结
    f = open("歌单", mode="w", encoding="utf-8")
    content = f.read()     # 在w模式下. 去读. 会出错
    print(content)
    f.write("两只老虎
    ")
    f.write("忐忑")
    f.flush()  # 刷新管道
    f.close()
    
    #正确示范:这歌单很牛逼的,谁听谁知道
    f = open("歌单", mode="w", encoding="utf-8")
    s = ["起风了", "凤舞九天", "冰河时代"]
    for e in s:
        f.write(e)
    f.close()
  • wb模式

    #喜欢带b的模式文件操作模式,符合我懒的气质,不用写编码方式
    #下面这个操作也是为了绕,非要在字节模式写汉字,完了用pycharm打开文件还TM是汉字,其中的奥秘只有地球人知道。
    f = open("歌单", mode="wb")
    f.write("金毛狮王".encode("UTF-8"))
    f.flush()
    f.close()

4. 追加(a, ab)

  • a模式

    #已经轻车熟路了,不多介绍了。
    f = open("歌单哈哈", mode="a", encoding="UTF-8")
    f.write("又见炊烟")
    f.flush()
    f.close()
  • ab模式

    f = open("歌单哈哈.txt", mode="ab")
    f.write("又见炊烟".encode('utf-8'))
    f.flush()
    f.close()

5. r+读写

  • 重头戏r+模式

    # 正常用法
    f = open("歌单", mode="r+", encoding="UTF-8")
    #
    content = f.read()
    print(content)
    
    #
    f.write("成都")
    f.flush()
    f.close()
    
    # 非正常用法
    f = open("歌单", mode="r+", encoding="UTF-8")
    #
    f.write("凉凉")
    #
    content = f.read()
    print(content)
    f.flush()
    f.close()
    #深坑请注意: 在r+模式下. 如果读取了内容. 不论读取内容多少. 光标显⽰示的是多少. 再写入 或者操作文件的时候都是在结尾进行的操作.

6. w+写读

  • w+模式

    # 先将所有的内容清空. 然后写入. 最后读取. 但是读取的内容是空的, 不常用 
    f = open("⼩娃娃", mode="w+", encoding="utf-8")
    f.write("哈哈")
    content = f.read()
    print(content)
    f.flush()
    f.close()

7. a+写读(追加写读)

  • a+模式


    f = open("⼩娃娃", mode="a+", encoding="utf-8") f.write("⻢化腾") content = f.read() print(content) f.flush() f.close() # a+模式下, 不论先读还是后读. 都是读取不到数据的.

    # 还有一些其他的带b的操作. 就不多赘述了了. 就是把字符换成字节. 我这么懒就不分享了,欢迎留言分享。

8. 其他操作方法

  • seek和tell好基

    #seek的常规操作
    f.seek(3)   # 移动的是字节单位,在UTF-8文件中. 如果是中文移动的必须是3的倍数
    f.seek(0) # 重新回到起点
    f.seek(0, 2) # 移动到结尾
    
    #tell的一阳指
    print(f.tell())  # 告诉光标在哪里
  • 被遗忘的truncate

    #直接粘习题了,用法自行体会吧
    
    # h,截取原文件,截取内容:‘葫芦娃,葫芦娃,’
    # 1.先用seek,再去截取,有点多此一举
    f = open('db1/葫芦娃', 'r+', encoding='utf-8')
    f.seek(24)
    f.truncate()
    f.seek(0)
    print(f.read())
    f.flush()
    f.close()
    # 2.直接去截取
    f = open('db1/葫芦娃', 'r+', encoding='utf-8')
    f.truncate(24)
    print(f.read())
    f.flush()
    f.close()

9. 文件的修改

  • 提前搞一波OS模块

    #用了课后练习的代码,还是默写,重点,重点,第三遍不说了!
    import os
    with open('../db2/alex.txt','r',encoding='utf-8')as f1,
        open('../db2/alex_new.txt','w',encoding='utf-8')as f2:
        for i in f1:
            new_i=i.replace('alex','SB')
            f2.write(new_i)
    os.remove('../db2/alex.txt')
    os.rename('../db2/alex_new.txt','../db2/alex.txt')

10.相对路径和绝对路径

  • 绝对路径. 从磁盘根目录寻找文件

    #举个栗子:
    path = "d:/sylar/呵呵.txt"
  • 相对路径, 相对于你当前文件所在的位置

    #再举个栗子
    path = "呵呵.txt"
  • 返回上一级:../

  • 路径里有 , , 这种有歧义的字母开头需要通过加反斜杠进行转义,或者直接在路径前面加r

    # 建议一般不要起这种带特殊意义字母开头的单词
    # 第一个斜杠用来转义
    path1 = 'db\test.txt'
    # 加r牛逼,一步到位
    path2 = r'test.txt'
原文地址:https://www.cnblogs.com/changwentao/p/9157233.html