zoukankan      html  css  js  c++  java
  • python — 文件操作

    1 .文件基本操作

    obj = open('路径',mode='模式',encoding='编码')  # 打开文件
    obj.write()     # 写入内容
    obj.read()      # 读取文件
    obj.close()     # 关闭文件
    

    2. 打开模式

    • r / w / a 【只读只写字符串】
    • r+ / w+ / a+ 【可读可写字符串】
    • rb / wb / ab 【只读只写二进制】
    • r+b / w+b / a+b 【可读可写二进制】

    2.1 模式:r / w / a

    • 1.读取 r

      # 打开文件
      file_object = open('log.txt',mode = 'r',encoding = 'utf-8')
      '#  log.txt' 文件路径   encoding = 'utf-8' 存储时的方式,用什么方式存储就用什么方式读取读取内容
      # 读取文件
      content= file_object.read()  # 读取文件的内容到内存(全部)
      print(content)
      # 关闭文件
      file_object.close()
      

      r 只能读不能写,文件不存在则报错。

    • 2.写入 w

      # 打开文件
      file_object = open('log.txt',mode = 'w',encoding = 'utf-8')
      # 写入内容
      file_object.write('李忠伟')
      # 关闭文件
      file_objet.close()
      

      w 只能写不能读

      w 要慎重使用,使用 w 打开文件时是先清空文件再写入内容的。一般用于新建文件(文件不存在则新建)。

    • 3.追加 a

      # 打开文件
      file_object = open('log.txt',mode = 'a',encoding = 'utf-8')
      # 写入内容
      file_object.write('你好')
      # 关闭文件
      file_objet.close()
      

      a 只追加不能读,只在文件内容的最后面追加。

      文件不存在则新建

    2.2 模式:r+ / w+ / a+

    • 1.可读可写 r+

      # 打开文件
      file_object = open('log.txt',mode = 'r+',encoding = 'utf-8')
      file_object.seek(3)     # 把光标移到文件开头第3个字节的位置
      file_object.write('999')   # 在第3个字节的位置写入999
      
      # 读取内容
      content= file_object.read()
      print(content)
      file_object.write('666') # 在前面写入的999的位置处写入666
      
      # 关闭文件
      file_object.close()
      

      写入时:根据光标的位置,从当前光标位置开始进行写入操作(可能会将光标后其他的文字覆盖)

      总结:

      • 读:默认从0的光标开始读,也可以通过seek调整光标的位置
      • 写:从光标所在的位置开始写,也可以通过seek调整光标的位置。
    • 2.可读可写 w+

      file_object = open('log.txt',mode = 'w+',encoding = 'utf-8')
      
      data = file_object.read()
      print(data)   # 文件是空的
      file_object.write('alex')   # a
      file_object.seek(0)        #  b
      file_object.read()         #  c
      '# a+b+c这三步:a 写完后光标在最后面,想要进行 c 读取,需要在 c 前加入 b 将光标跳到0字节位置处(即文件开头位置)
      print(data)
      
      file_object.close()
      

      写入时会将文件清空,读取时需要调整光标的位置开始读取。

      总结:

      • 读:默认光标永远在写入的最后或0(打开清空了还没写入时在0的位置),也可以通过seek调整光标的位置。
      • 写:先清空
    • 3.可读可写 a+

      file_object = open('log.txt',mode = 'a+',encoding = 'utf-8')
      
      file_object.seek(0)
      data = file_object.read()
      print(data)
      
      file_object.seek(0)
      file_object.write('666')
      
      file_object.close()
      

      总结:

      • 读:默认光标在最后,也可以通过seek调整光标的位置,然后再去读取。
      • 写:永远写到最后

    2.3 模式:rb / wb / ab

    • 1.rb 二进制读取

      rb 只能二进制读取不能二进制写,文件不存在则报错。

    • 2.wb 二进制写入

      wb 只能二进制写入不能二进制读取

      wb 要慎重使用,使用 wb 打开文件时是先清空文件再写入内容的。一般用于新建文件(文件不存在则新建)。

    • 3.ab 二进制追加

      ab 只追加不能读,只在文件内容的最后面追加。

      文件不存在则新建

    2.4 模式:r+b / w+b / a+b

    • 1.可读可写二进制 r+b

      写入时:根据光标的位置,从当前光标位置开始进行写入操作(可能会将光标后其他的文字覆盖)

      总结:

      • 读:默认从0的光标开始读,也可以通过seek调整光标的位置
      • 写:从光标所在的位置开始写,也可以通过seek调整光标的位置。
    • 2.可读可写二进制 w+b

      写入时会将文件清空,读取时需要调整光标的位置开始读取。

      总结:

      • 读:默认光标永远在写入的最后或0(打开清空了还没写入时在0的位置),也可以通过seek调整光标的位置。
      • 写:先清空
    • 3.可读可写二进制 a+b

      总结:

      • 读:默认光标在最后,也可以通过seek调整光标的位置,然后再去读取。
      • 写:永远写到最后

    3. 操作

    3.1 读操作

    • read() , 全部读到内存

    • read(1)

      • 1表示一个字符

        obj = open('a.txt',mode='r',encoding='utf-8')
        data = obj.read(1) # 1个字符
        obj.close()
        print(data)
        
      • 1表示一个字节

        obj = open('a.txt',mode='rb')
        data = obj.read(3) # 1个字节
        obj.close()
        
    • 读取小文件:

      file_object = open('log.txt',mode = 'r',encoding = 'utf-8')
      
      data = file_object.read()      # 读取文件的所有内容到内存
      data = file_object.read(2)     # 从当前光标所在的位置向后读取文件两个字符
      data_list = file_object.readlines()      # 读取文件的所有内容到内存,并按照每一行进行分割到列表中。 (每行结尾会隐藏着一个换行符 
      )
      
    • 读取一个特别大的文件:

      # 方式一:
      start = 0
      while True:
          data = file_object.read(2)
          print(data)
      
      file_object.close()   # 最后一直在循环空,终止条件不好设定。
      
      # 方式二:
      for line in file_object:
      	line = line.strip()  # 打印完后每行都存在一个换行符,strip 不但能去除空白,也能去除换行符
      
      
      print(line) 
      

    3.2 写操作

    • write(字符串)

      obj = open('a.txt',mode='w',encoding='utf-8')
      obj.write('中午你')
      obj.close()
      
    • write(二进制)

      obj = open('a.txt',mode='wb')
      
      # obj.write('中午你'.encode('utf-8'))
      v = '中午你'.encode('utf-8')
      obj.write(v)
      
      obj.close()
      
      # 字符串转换 “二进制”: 
      v = "你好"
      data = v.encode('utf-8')
      # 二进制转换成字符串
      v = b'xe6x88x91xe5xa5xbdxe5x9bxb0'
      data = v.decode('utf-8')
      
    • 写入练习:

      # 示例一 : 一般用于文字写入。
      f = open('a.txt',mode='w',encoding='utf-8')
      # a. 将 “你好” 根据encoding指定的编码转换成: 
      #       “你好” --> 10001000 10001000 10001000 10001000 10001000 10001000
      # b. 将二进制写入到文件中。
      f.write('你好') # w打开文件,则write传入字符串
      f.close()
      
      # 示例二:写入内容是否写在一行
      file_object = open('log.txt',mode = 'w',encoding = 'utf-8')
      #  '你好小黑'写在一行
      file_object.write('你好')
      file_object.write('小黑')
      #  '你好' 与 '小黑' 写成两行
      file_object.write('你好
      ')
      file_object.write('小黑')
      file_object.close()
      
      # 示例三:一般用于图片/音频/视频/未知编码 
      f = open('a.txt',mode='wb')
      # f.write('你好')  # wb打开文件,则write传入的是二进制,但‘你好’是字符串不是二进制,需要转换后再写入。
      # 1. 把要写入的字符串转换成二进制
      data = "我好困"
      content = data.encode('utf-8') # 将字符串按照utf-8编码转换成二进制
      # 2. 再将二进制写到文件中
      f.write(content) # wb打开文件,则write传入的是 二进制
      f.close()
      
    • 注意:

      • 写完后一定要记得关闭(close)文件,如果没关闭就相当于写的东西直接写到内存了。
      • 关闭文件(close)就强制将内存刷到硬盘上了
    • 
      

    3.3 其他操作

    • seek(光标字节位置),无论模式是否带b,都是按照字节进行处理。

      # 读取字符串
      obj = open('a.txt',mode='r',encoding='utf-8')
      obj.seek(3) # 跳转到指定字节位置
      data = obj.read()
      obj.close()
      print(data)
      
      # 读取字节
      obj = open('a.txt',mode='rb')
      obj.seek(3) # 跳转到指定字节位置
      data = obj.read()
      obj.close()
      print(data)
      
    • tell(), 获取光标当前所在的字节位置

      obj = open('a.txt',mode='rb')
      # obj.seek(3) # 跳转到指定字节位置
      obj.read()
      data = obj.tell()
      print(data)
      obj.close()
      
    • flush,强制将内存中的数据写入到硬盘

      v = open('a.txt',mode='a',encoding='utf-8')
      while True:
          val = input('请输入:')
          v.write(val)
          v.flush()
      
      v.close()
      

    4. 关闭文件

    文艺青年操作:

    v = open('a.txt',mode='a',encoding='utf-8')
    
    v.close()
    

    二逼操作:

    with open('a.txt',mode='a',encoding='utf-8') as v:
        data = v.read()
    	# 缩进中的代码执行完毕后,自动关闭文件
    

    5. 文件内容的修改

    with open('a.txt',mode='r',encoding='utf-8') as f1:
        data = f1.read()
    new_data = data.replace('飞洒','666')
    
    with open('a.txt',mode='w',encoding='utf-8') as f1:
        data = f1.write(new_data)
    

    大文件修改:

    f1 = open('a.txt',mode='r',encoding='utf-8')
    f2 = open('b.txt',mode='w',encoding='utf-8')
    
    for line in f1:
        new_line = line.replace('阿斯','死啊')
        f2.write(new_line)
    f1.close()
    f2.close()
    
    with open('a.txt',mode='r',encoding='utf-8') as f1, open('c.txt',mode='w',encoding='utf-8') as f2:
        for line in f1:
            new_line = line.replace('阿斯', '死啊')
            f2.write(new_line)
    
  • 相关阅读:
    开发环境搭建
    添加约束设置方式
    ubuntu和windows双系统启动顺序的修改
    函数指针,指针函数,数组指针,指针数组 区分
    boost
    centos7 64位如何配置网络
    MySQL数据库(主键、索引、外键、触发器...)
    几种常见字符集与字符编码
    ODBC、OLEDB应用详解
    C#事件以及EventHandler、EventArgs
  • 原文地址:https://www.cnblogs.com/yangjie0906/p/10765088.html
Copyright © 2011-2022 走看看