组团学

Python 对文件的IO操作

阅读 (179213)

一、读操作

1、读文件

  • 过程

    a、找到文件

    b、打开文件

    c、读取文件的内容

    d、关闭文件

  • 找到文件

    绝对路径:从根目录开始链接的路径

    相对路径:不是从根目录开始链接的路径

    path = r"file.txt"
  • 打开文件

    • 原型

      def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
    • 参数

      file:要打开的文件的路径

      mode:打开方式

      encoding:编码格式

      errors:错误处理方式(ignore表示直接忽略)

    • 返回值

      文件描述符,从当前的位置操作当前打开的文件

    • 打开方式

      方式 说明
      r 以只读的方式打开文件,文件的引用(描述符)将会被放在文件开头
      rb 以二进制格式打开只读文件,文件的引用(描述符)将会被放在文件开头
      r+ 以读写的方式打开文件,文件的引用(描述符)将会被放在文件开头
      w 以只写的方式打开文件,如果该文件存在,则将其内容覆盖,如果文件不存在则会创建该文件
      wb 以二进制格式打开只写文件,如果该文件存在,则将其内容覆盖,如果文件不存在则会创建该文件
      w+ 以读写的方式打开文件,如果该文件存在,则将其内容覆盖,如果文件不存在则会创建该文件
      a 打开一个文件用于追加内容,如果该文件存在,文件描述符会被放到文件的末尾,如果文件不存在则会创建该文件
      a+ 打开一个文件用于读写,如果该文件存在,文件描述符会被放到文件的末尾,如果文件不存在则会创建该文件
    • 打开

      打开普通文件

      fp = open(path, "r")

      打开二进制文件

      fp = open(path, "rb")

      指定编码格式

      fp = open(path, "r", encoding="utf-8")

      指定错误处理方式

      fp = open(path, "r", encoding="utf-8", errors="ignore")
  • 读取文件的内容

    • 读取文件的全部内容

      str1 = fp.read() print(str1)
    • 读取指定字节数的内容

      str2 = fp.read(4) print(str2)
    • 读取整行内容(包括\n字符)

      str3 = fp.readline() print("*"+str3+"*")
    • 读取指定字节数内容

      str4 = fp.readline(13) print("*"+str4+"*")
    • 读取所有行并返回一个列表,列表中的元素是每行内容

      list5 = fp.readlines() print(list5)
  • 修改文件描述符的位置

    str6 = fp.read(4) print("*"+str6+"*") str7 = fp.read(4) print("*"+str7+"*") #修改文件描述符的位置 fp.seek(1) str8 = fp.read(4) print("*"+str8+"*")
  • 关闭文件

    • 注意

      文件使用过后必须关闭

    • 原因

      释放资源,系统能打开的文件个数是有限制的,所以需要释放相应文件的文件描述符

    • 关闭方式

      程序结束自动关闭:程序结束时会释放文件对象的空间,文件会关闭,但是不建议这样来做,最好手动关闭

      手动关闭:调用代码关闭

    • 示例

      fp.close()

2、读文件完整过程

try: fp = open("file.txt", "r") print(fp.read()) finally: if fp: fp.close()

3、读文件简写方式

with open("file.txt", "r") as fp: print(fp.read())

二、写操作

1、写文件

  • 过程

    • 找到文件
    • 打开文件
    • 将内容写入缓冲区,此时内容没有写入文件
    • 刷新缓冲区,直接把缓存区中的数据立刻写入文件
    • 关闭文件
  • 刷新缓冲区方式

    • 程序结束
    • 关闭文件
    • 手动刷新
    • 缓冲区满了
    • 遇到\n
  • 找打文件

    path = "file.txt"
  • 打开文件

    fp = open(path, "w")
  • 将内容写入缓冲区

    fp.write("sunck good")
  • 手动刷新缓冲区

    fp.flush()
  • 关闭文件

    fp.close()

2、写文件完整过程

try: fp = open("file.txt", "w") fp.write("cool man") finally: if fp: fp.close()

3、写文件简写方式

with open("file.txt", "w") as fp: fp.write("cool man")

三、编码与解码

1、编码

with open("file.txt", "wb") as fp: s = "sunck is a good man凯" s = s.encode("utf-8") fp.write(s)

2、解码

with open("file.txt", "rb") as fp: s = fp.read() s = s.decode("utf-8") print(s)

3、chardet模块

  • 作用

    使用chardet检测编码,支持检测中文、日文、韩文等多种语言

  • 安装

    pip install chardet

  • 使用

    import chardet # 注意:数据量小,猜测的不准 data = "凯哥是一个好男人".encode("gbk") # print(data) ret = chardet.detect(data) print(ret, type(ret)) ''' encoding:表示编码格式 confidence:表示检测的正确的概率 language:表示数据的语言 ''' ''' GBK是GB2312的超集,两者是同一种编码 ''' info = data.decode(ret["encoding"]) print(info)

四、特殊的读写

1、list、tuple、dict、set的文件操作

  • pickle模块

    持久化保存对象,将list、tuple、dict、set等数据序列化存储到文件

    import pickle
  • 存储

    user = {"account": "sunck", "passwd": "666"} with open("file.txt", "wb") as fp: pickle.dump(user, fp)
  • 读取

    with open("file.txt", "rb") as fp: user = pickle.load(fp) print(user, type(user))

2、StringIO

  • 作用

    数据的读写不一定都是文件,也可以是内存中读写,StringIO可以在内存中读写字符串

  • 导入

    from io import StringIO
  • fp = StringIO() fp.write("sunck is\n") fp.write(" a good ") fp.write("man!") # 获取写入的内容 print(fp.getvalue())
  • fp.seek(0) print(fp.read()) fp.seek(0) print(fp.readline()) fp.seek(0) print(fp.readlines())

注意:文件使用后关闭文件

3、BytesIO

  • 作用

    数据的读写不一定都是文件,也可以是内存中读写,StringIO只能操作字符串,BytesIO可以操作二进制数据

  • 使用

    from io import BytesIO fp2 = BytesIO() fp2.write("sunck is a nice man".encode("utf-8")) fp2.seek(0) print(fp2.read().decode("utf-8")) fp2.close()
需要 登录 才可以提问哦