Python基础(十六): 文件读写

本文详细介绍了Python中文件操作的方法,包括文件的定位、读取、写入及关闭等基本操作。探讨了seek方法用于文件定位,read系列方法进行数据读取,write方法实现数据写入,并解释了如何正确关闭文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、定位

  • 文件定位, 是指在操作文件时, 控制文件句柄(指针)的位置, 也就是控制文件的读取起点位置
1、seek(字节, [0, 1, 2])
  • Python提供了seek(字节, [0, 1, 2])方法, 来控制文件句柄的位置

  • 首先, 先看一下文档中对seek方法的描述

Change stream position.
    
Change the stream position to the given byte offset. The offset is
interpreted relative to the position indicated by whence.  Values
for whence are:
    
* 0 -- start of stream (the default); offset should be zero or positive
* 1 -- current stream position; offset may be negative
* 2 -- end of stream; offset is usually negative
    
Return the new absolute position.
复制代码
  • 翻译:
改变流的位置

根据字节数改变流的偏移量, 偏移量相对于何处开始偏移, 下面是对应的值:

0: 流开始的位置(默认), 从零开始偏移
1: 当前的位置, 字节可以是负数
2: 流结尾的位置, 字节通常是负数

返回一个新的绝对位置
复制代码
  • 就是说seek(字节, [0, 1, 2]), 会根据第二个参数指定的位置, 偏移第一个参数字节

    • 0: 从文件开始的位置

    • 1: 当前文件句柄位置

    • 2: 文件结尾的位置

    • 注意: 1/2只能在二进制模式下使用(+b, 例如: rb, wb, ab等)

2、示例
  • r模式下, 使用seek方法改变文件读取的开始位置
  • 现有文件test, 内容是:1234567890

  • 使用seek方法从起始位置偏移两个字节长度

  • 程序运行后, 读取内容是34567890, 说明文件句柄从2的位置, 开始向后读取数据

  • 上面使用的seek(2, 0)中, 第二个参数0, 对应的是从文件开始的位置开始偏移两个字节
  • 下面使用seek(-2, 2), 操作文件

  • 上图中, 使用第二个参数使用2时, 直接报错, 这是因为1和2都只能用在二级制方式操作文件上, 将r改成rb, 就可以操作文件了

  • 使用rb模式操作文件, 可以看到打印信息时b"90", 其中的b表示使用二进制方式访问文件, 90就是test文件中最后两个数据
  • 即: seek(-2, 2)表示将文件句柄移动到相对于文件结尾前两个字节处
3、tell()方法
  • Python提供了tell()方法, 可以查看文件句柄当前的位置

  • 下面使用tell方法, 查看文件句柄的位置

二、读

1、read(字节数)
  • Python提供了read(字节数)方法, 来读取文件中的数据, 同时移动句柄位置

  • read(字节数): 字节数量默认为文件内容字节长度, 下面是在不传入字节数的情况下, 读取了test中的全部数据

  • 接着, 可以使用seek(2, 0)移动文件句柄位置, 在读取5个字节长度的数据, 打印: 34567

2、readline([limit])
  • readline([limit]): 读取文件中某一行数据, 一直到换行符\n为止, 并且该行结尾的换行符\n也会读取

    • [limit]: 表示最大字节数
  • 我们现在test文件中加入第二行数据: abcdefg

  • 接着使用readline()读取数据, 可以看到两行打印(实际还有一行\n), 每一行后面的换行符\nprint()end的默认值\n都被打印

3、readlines()
  • readlines(): 将文件内容中数据的所有行读取出来, 放在一个数组中

  • 打印: ['1234567890\n', 'abcdefg']
4、for in
  • 可以使用for in循环遍历文件, 以及readlines()的返回

  • 首先修改test文件中内容

  • 接着使用for in循环遍历文件内容, 可以看到打印信息

  • 每两行中间都有一个空行, 这是因为test中每一行数据后都有个\n, 再加上print()end的默认值是\n, 所以才会显示出一个空行

  • 可以将print()中的end换成""空字符串, 再次运行程序, 空行就没有了

  • 还可以使用for in遍历readlines()返回的数组

5、readable(): 判定文件是否可读
  • 已知在a模式w模式下, 文件都是不可读的, 如果读取文件程序会直接报错

  • 我们可以使用readable()方法, 来判定文件是否可读

  • 接下来, 使用readable()判定w模式下, 文件是否可读, 结果: 文件不可读

  • 使用readable()判定r模式下, 文件是否可读, 结果: 文件可读

注意:

  1. 一般文件特别大的时候, 可以使用readline方法, 按行加载, 可节省内存, 但是相比于其他两个读取方法, 性能较低
  2. read(字节数)和readlines方法, 一次性读取文件所有内容, 占用内存较多, 但是性能比较高

三、写

1、write("内容")
  • Python提供了方法write(内容), 将数据写入文件中, 并返回写入内容字节长度

  • 下面在a模式下, 将hellow写入到文件test

2. writable(): 判定文件是否支持写入操作
  • r模式下, 判断文件是否可以写入, 结果: 文件不可写入

  • a模式下, 判定文件是否可以写入, 结果: 文件可写入

四、关闭

  • 在操作文件的时候, 有可能出现短时间内多次写入操作, 即写入频率高

  • 如果每一次写入都立即存储到磁盘, 那么就会消耗大量的性能

  • 所以为了优化文件的写入操作, 在数据写入到磁盘之前, 都会先存放在缓存区, 最后一次性存储到磁盘

close(): 关闭文件, 释放系统资源, 同时将缓冲区内容一次性写入到磁盘中
  • 在操作磁盘的时候, 会占用系统的资源, 而close()方法, 可以释放这些资源, 同时将缓冲区中的内容写入到磁盘中
flush()
  • 在我们操作文件的时候, 如果想要立即将缓冲区内容写入到磁盘, 同时又不想关闭文件, 那么就可以使用flush()方法
  • flush(): 将缓冲区的内容立即写入到磁盘, 同时不关闭文件操作, 不释放相关资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值