桐花万里python路-基础篇-07-文件操作

  • 流程
    • 打开文件,得到文件句柄并赋值给一个变量
      file object = open(file_name [, access_mode][, buffering])
      参数说明
        file_name:file_name变量是一个包含了你要访问的文件名称的字符串值
        access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)
        buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认
    • 通过句柄对文件进行操作 
    • 关闭文件
      # 读文件
      f = open('abc.txt','r') #打开文件
      first_line = f.readline()
      data = f.read()# 读取剩下的所有内容,文件大时不要用
      f.close() #关闭文件
      # 写文件
      f = open('abc.txt','w',encoding="utf-8") #打开文件
      f.write("哈喽,world")
      f.close() #关闭文件
  • 打开文件模式
    • 图解说明
    • 列表说明
      模式rr+ww+aa+
      + +   +   +
        + + + + +
      创建     + + + +
      覆盖     + +    
      指针在开始 + + + +    
      指针在结尾         + +
    • 详细说明
      模式描述
      r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
      rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
      r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
      rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
      w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
      wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
      w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
      wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
      a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
      ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
      a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
      ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
  • 方法说明
    • read 可以是文字,二进制数据
      fileObject.read([count])
      # count是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,
      # 如果没传count,它会尝试尽可能多地读取更多的内容,直到文件的末尾
    • readline
      fileObject.read([count])
      # 读一行,如果定义了count,有可能返回的只是一行的一部分
    • readlines
      fileObject.readlines([count])
      # 把文件每一行作为一个list的一个成员,并返回这个list。
      # 其实它的内部是通过循环调用readline()来实现的。
      # count是表示读取内容的总长,也就是说可能只读到文件的一部分
    • write
      fileObject.write(string)
      # 把string写到文件中,write()并不会在string后加上一个换行符
    • writelines
      fileObject.writelines(seq)
      # 把seq的内容全部写到文件中(多行一次性写入),不会在行后加上一个换行符
      f = open('abc.txt', 'w+')
      f.writelines(['a', 'b', 'b'])
      f.close()
    • tell 返回文件操作标记的当前位置,以文件的开头为原点
    • seek
      fileObject.seek(offset[,whence])
      # 将文件操作标记移到offset的位置,offset相对于文件的开头来计算的,一般为正数
      # whence参数:0表示从头开始计算,1表示以当前位置为原点计算,2表示以文件末尾为原点进行计算
      # 如果文件以a或a+的模式打开,写操作时,文件操作标记会自动返回到文件末尾
      # 打开一个文件
      fo = open("foo.txt", "r+")
      string = fo.read(10)
      print("读取的字符串是 : ", string)
      
      # 查找当前位置
      position = fo.tell()
      print("当前文件位置 : ", position)
      
      # 把指针再次重新定位到文件开头
      fo.seek(0, 0)
      position = fo.tell()
      print("当前文件位置 : ", position)
      string = fo.read(10)
      print("重新读取字符串 : ", string)
      # 关闭打开的文件
      fo.close()
    • truncate
      fileObject.truncate([count])
      # 把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。
      # 如果count比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
    • flush
      fileObject.flush()
      # 刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区
      # 文件关闭后会自动刷新缓冲区
    • close 刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入
    • with 为了避免打开文件后忘记关闭,可以通过管理上下文
      with open('log','r') as f:
          f.readline()
      
      # 当with代码块执行完毕时,内部会自动关闭并释放文件资源 (推荐用法)
      # 在Python 2.7 后,with又支持同时对多个文件的上下文进行管理
      with open('log1') as obj1, open('log2') as obj2:
          pass
  • 文件编码
    • 保存文件时,文件编辑器"默默地"帮文件内容做了编码工作;打开文件时,软件又默默地给做了解码的工作,将数据解码成unicode。py解释器本身就是一个软件
    • unicode是离用户更近的数据,bytes是离计算机更近的数据
    • win下的终端即cmd.exe,这个软件默认的编码解码方式是GBK,所以cmd.exe用GBK的解码方式去解码utf8自然会乱码
    • 文件保存的是gbk编码,在win 下就不用指定encoding了
    • open这个函数在py2里和py3中是不同的,py3中有了一个encoding=None参数
原文地址:https://www.cnblogs.com/zhujingxiu/p/8253496.html