文件与IO(Python)Python操作文件教程

一、打开文件

  • 文件操作必须先打开文件,需要用到内置函数open
open(file,mode = 'r,buffering   =1,encoding = None,errors = None,newline = None,closefd = True,opener = None)
  • 文件名,打开方式,文件缓冲,文件编码,文件错误,换行,closefd,打开人员
  • 如果文件打开正常,open函数会返回一个文件对象,否则会抛出一个OSError异常

1、文件模式

  • open函数的参数mode指明了要以什么方式打开文件,使用不同的方式打开文件,即使操作相同,产生的操作也不同
  • Python默认打开模式是“ r ”,即只读
  • Python在读写文件时会区分二进制和文本两种方式
  • 二进制:内容将作为字节对象返回,不会对文件内容进行任何解码
  • 文本(模式中带有“ b ”):内容将作为str类型返回,文件内容会根据平台相关的编码或者指定了的 encoding 参数的编码进行解码

2、文件编码

  • 在文本方式下,如果没有指定编码,Python解释器会根据不同的系统使用不同的编码来解码文件

3、文件缓冲

  • 缓冲的目的是减少系统的IO调用,只有在符合一定条件(比如缓冲数量)之后系统才调用IO写入磁盘

缓冲参数:

  • 0:关闭缓冲(仅在二进制模式下使用)
  • 1:选择行缓冲(仅在文本模式下使用)
  • 大于1:可以指示固定大小的块缓冲区的大小(以字节为单位)
  • 未给出参数则默认缓冲策略的工作方式如下:二进制文件在固定大小的块中进行缓冲,缓冲区的大小则是通过使用试探法来试图确定底层设备的“块大小”的,然后将之存储到io.DEFAULT_BUFFER_SIZE变量当中
  • 在许多系统中,缓冲区的长度通常是 4096 个或 8192 个字节长

二、文件基本操作

1、读文件

  • read方法能够从一个打开的文件中读取内容到字符串
  • read方法也可以传递参数,用于指定读取多少个字符
  • 如果传入参数大于文件总字符数则将之文件内容读取即可

Tips:Python的字符串可以是二进制的数据,而不仅仅是文字
在这里插入图片描述

2、写文件

  • 以“ w ”模式的方式打开文件,就可以使用文件对象的write方法,将任意字符串写入到文件中,write方法返回写入文件的字符串的长度
  • 以 w 打开的文件进行写入时会清空原文件内容(如果文件不存在,则创建新文件)
  • 以“ a ”模式的方式打开文件,就可以在打开的文件末尾进行追加写入(如果文件不存在,则创建新文件进行写入)
    在这里插入图片描述

3、按行读文件

  • Python提供了一种按行读取文件内容的方法,readline函数可以逐行读取文件内容
  • readlines函数也会读取整个文件,并将文件内容按行切割,返回一个list对象,并保留换行符,所以,在输出时每次都会输出一个空白行
  • 文件对象本身也可以进行迭代,与readlines函数的区别在于readlines函数是将整个文件读取并返回一个list,但是直接迭代文件对象是一种“惰性”读取文件的方式,只有迭代到需要读取的一行,才会真的执行读取操作
  • 迭代文件的好处是如果文件非常大,并且只需要一行一行地处理文件,就不用把整个文件都导入到内存中了
    在这里插入图片描述

4、按行写文件

  • Python提供了writelines方法把列表作为参数写入文件,Python不会帮我们添加换行符
  • 该方法接收一个列表作为参数,列表的每个元素就是想写入的每行文本内容,同时需要我们自行添加换行符
    在这里插入图片描述

5、关闭文件

  • 一般情况下,文件对象在程序退出后都会自动关闭
  • close方法用来显式地关闭文件
  • with语句的代码块执行完毕以后会帮助我们执行close语句
    在这里插入图片描述

三、StringIO和BytesIO

1、StringIO

  1. 当数据并不需要真正地写入到文件中时,只需要在内存中做读取写入即可
  2. StringIO:创建一个StringIO对象,其可以像文件一样进行操作(只能操作str类型)
    在这里插入图片描述
    在这里插入图片描述

也可以在创建时进行初始化
在这里插入图片描述
在这里插入图片描述

  • getvalue方法用于获取写入后的字符串

2、BytedIO:实现在内存中读写bytes

在这里插入图片描述
在这里插入图片描述

初始化
在这里插入图片描述
在这里插入图片描述

四、序列化与反序列化

  • 程序在运行的时候,所有变量都保存在计算机内存中,把变量从内存中变为可存储或传输的过程称为序列化,我们可以把序列化后的内容写入磁盘或者通过网络传输到别的计算机上,反过来,把变量内容从序列化的对象重新读取到内存的过程称为反序列化

1、pickle模块

  • 该模块是Python标准库中的模块,它实现了一些基本数据的序列化和反序列化
  • 通过pickle模块的序列化操作,可以将程序中运行的对象信息保存到文件中,永久存储
  • 通过pickle模块的反序列化操作,可以从文件中恢复或者创建上次程序保存下来的对象
  • pickle模块中的dumps方法可以把对象序列化成bytes,然后写入文件中永久存储
  • pickle.dump方法可以帮助我们把任意对象序列化成bytes,然后直接写入到文件对象中
    在这里插入图片描述
    在这里插入图片描述

2、JSON序列化与反序列化

  • 一种轻量级的数据交换格式,易于阅读和编写,也易于机器解析和生成
  • 基于JavaScript编程语言
  • 采用完全独立于语言的文本格式,也使用了类似于C语言家族(C、C++、C#、Java、JavaScript、Perl、Python等)的习惯,这些特性使JSON成为理想的数据交换语言
  • JSON建构于两种结构:
  • 键值对 集合(在Python中称为字典)dict
  • 值的有序列表(在Python中为列表)list
  • JSON模块的序列化使用方法和pickle模块一样,但是pickle可以序列化任意Python对象,而JSON模块只能序列化上表类型
    序列化字典(JSON会把中文转码为Unicode编码):

    在这里插入图片描述

直接写入文件对象

在这里插入图片描述
在这里插入图片描述

  • 反序列化:JSON只能应用在使用JSON序列化的数据上,不能反序列化pickle模块序列化后的bytes数据
  • 从文件对象反序列化
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枳洛淮南✘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值