阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Python 对文件的IO操作

204次阅读
没有评论

共计 2910 个字符,预计需要花费 8 分钟才能阅读完成。

一、读操作

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()

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-05-26发表,共计2910字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中