zoukankan      html  css  js  c++  java
  • 博客整理day09

    Python day09

    一 文件处理

    • 什么是文件

      操作系统提供的虚拟概念,存储信息(用二进制存储信息)

    • 操作文件的流程

      # 1. 打开文件
      # ①文件路径②打开模式,w-->write③
      # print('D:上海python12期视频python12期视频day 09	est.py')
      # print('D:上海python12期视频python12期视频day 09\test.py') # \t--》第一个会让第二个失去意义
      # print(r'D:上海python12期视频python12期视频day 09	est.py') # r会让内部所有的失效
      f = open(r'D:上海python12期视频python12期视频day 09	est.py','w',encoding='utf8')
      
      # 2. 修改/读取文件
      f.write('''
      孩儿立志出湘关,学不成名誓不还
      埋骨何须桑之地,人生无处不青山
      ''')
      
      # 3. 保存文件
      f.flush()  # 快速保存,你可以不使用
      
      # 4. 关闭文件: python真的能操控文件?python通过操作系统操作文件
      # del f
      f.close()  # 告诉操作系统关闭文件
      

    二 文件打开的三种模式

    文件操作的基础模式有三种(默认的操作模式为r模式):

    • r模式为read
    • w模式为write
    • a模式为append

    文件读写内容的格式有两种(默认的读写内容的模式为b模式):

    • t模式为text
    • b模式为bytes

    需要注意的是:t、b这两种模式均不能单独使用,都需要与r/w/a之一连用。

    r模式

    #读取:rt  read_text 读文本内容 只读
    f = open(r'D:上海python12期视频python12期视频day 09	est.py', 'rt', encoding='utf8')
    f.write('slkdjfklj')
    data = f.read()
    print(data)
    print(f.readable()) # 判断是否可读
    print(f.writable()) # 判断是否可写
    
    data = f.read()  # 读取所有文本内容
    print(data)
    

    w模式

    # wt: 只写(w清空文件后写入),不可读
    f = open(r'D:上海python12期视频python12期视频day 09	est.py', 'wt', encoding='utf8')
    print(f.readable())
    print(f.writable())
    
    f.write('abc')
    

    a模式

    at: 只写入(追加写入)
    f = open(r'D:上海python12期视频python12期视频day 09	est.py', 'at', encoding='utf8')
    print(f.readable())
    print(f.writable())
    
    f.write('中')
    

    三 绝对和相对路径

    • 文件的路径: 文件在硬盘的地址

    • 绝对路径: 从盘符开始

    • 相对路径: 执行文件(当前运行的文件)的文件夹下的文件名,执行文件和打开文件属于同一文件夹下

    四 with管理上下文

    # with提供一个自动关闭文件(接触了操作系统的占用)
    with open('test.py', 'r', encoding='utf8') as f:
        # print(f.read())
        # 在这个缩进下不会关闭文件,在这个缩进下对文件操作
        data = f.read()  # data放到python的内存中
    
    print(data)
    # 关闭文件(操作系统),没有关闭python内存中的文件
    print(f)  # 只涉及python
    # print(f.read())  # 涉及操作系统,报错
    

    五 文件的高级应用

    可读可写

    #可写可读 r+
    with open('test.py', 'r+', encoding='utf8') as fr:
        # print(fr.readable())
        # print(fr.writable())
        fr.write('高级')  # 光标在文件头部,覆盖后面的字符
    
    #可写可读 w+ 和 w 没有任何区别
    with open('test.py', 'w+', encoding='utf8') as fw:
        print(fw.readable())
        print(fw.writable())
    
    #可写可读 a+ a模式默认光标在尾部
    with open('test.py','a+',encoding='utf8') as fw:
        print(fw.readable())
        print(fw.writable())
        fw.seek(0,0)
        print(fw.read())
    

    文件内指针移动

    1. seek(offset,whence): offset代表文件指针的偏移量,偏移量的单位是字节个数

      # seek()
      with open('36r.txt', 'rb') as fr:
          print(f"fr.seek(4, 0): {fr.seek(4, 0)}")  # 0相当于文件头开始;1相当于当前文件所在位置;2相当于文件末尾
          # fr.seek(0,2)  # 切换到文件末尾
      
    2. tell(): 每次统计都是从文件开头到当前指针所在位置

      # tell()
      with open('36r.txt', 'rb') as fr:
          fr.seek(4, 0)
          print(f"fr.tell(): {fr.tell()}")
      
    3. read(n): 只有在模式下的read(n),n代表的是字符个数,除此之外,其他但凡涉及文件指针的都是字节个数

      # read()
      with open('36r.txt', 'rt', encoding='utf-8') as fr:
          print(f"fr.read(3): {fr.read(3)}")
      
    4. truncate(n): truncate(n)是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate()要在r+或a或a+等模式下测试效果。它的参照物永远是文件头。并且truncate()不加参数,相当于清空文件。

      # truncate()
      with open('36r.txt', 'ab') as fr:
          fr.truncate(2) # 截断2个字节后的所有字符,如果3个字节一个字符,只能截断2/3个字符,还会遗留1/3个字符,会造成乱码
      

    六 文件修改的两种方式

    方法一

    ​ 将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)。

    import os
    
    with open('37r.txt') as fr, 
         open('37r_swap.txt', 'w') as fw:
     data = fr.read()  # 全部读入内存,如果文件很大,会很卡
     data = data.replace('tank', 'tankSB')  # 在内存中完成修改
    
     fw.write(data)  # 新文件一次性写入原文件内容
    
    # 删除原文件
    os.remove('37r.txt')
    # 重命名新文件名为原文件名
    os.rename('37r_swap.txt', '37r.txt')
    print('done...')
    

    方法二

    ​ 将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件。

    import os
    
    with open('37r.txt') as fr,
         open('37r_swap.txt', 'w') as fw:
     # 循环读取文件内容,逐行修改
     for line in fr:
         line = line.replace('jason', 'jasonSB')
         # 新文件写入原文件修改后内容
         fw.write(line)
    
    os.remove('37r.txt')
    os.rename('37r_swap.txt', '37r.txt')
    print('done...')
    
  • 相关阅读:
    SDN大作业
    个人作业——软件工程实践总结作业
    2019 SDN上机第7次作业
    2019 SDN上机第6次作业
    SDN课程阅读作业(2)
    个人作业——软件评测
    2019 SDN上机第5次作业
    2019 SDN上机第4次作业
    SDN阅读作业
    ThinkPHP3.2.2中开启REWRITE模式
  • 原文地址:https://www.cnblogs.com/samoo/p/11544390.html
Copyright © 2011-2022 走看看