《Python进阶系列》六:Python中的文件对象

2023-11-04

文件对象的seek()tell()

打开一个文件,读取内容,是很常见的操作。不过有的时候我们还需要反复读取文件中的内容,如果多次打开文件读取再多次关闭,显然不是特别好的操作,我们可以借助Python文件对象的seek()tell()函数,来实现反复的读取文件内容,最后再关闭文件。

tell()函数

先说tell()函数,这个简单,就是告诉我们当前文件读取指针处于文件的什么位置。tell()函数返回的位置,以byte计数:

>>> f = open('1.txt')
>>> f.tell()
0
>>> f.read(1)
'#'
>>> f.tell()
1
>>> f.read(24)
' GTR2SP2L A0A2 table\n# g'
>>> f.tell()
25

打开文件后,tell()返回的位置是0;读取一个字符,tell()就返回1。因此,python文件对象的tell()函数,返回的位置就是已经去读的最后一个byte,下次再read(),就是从这个位置往后开始算。

seek()函数

seek()函数是用来重新定位读取文件的指针位置。

>>> f.close()
>>> f = open('1.txt')
>>> f.read(48)
'# GTR2SP2L A0A2 table\n# generating time: 17:00:0'
>>> f.tell()
48
>>> f.seek(0)
0
>>> f.read(48)
'# GTR2SP2L A0A2 table\n# generating time: 17:00:0'

以上代码,中间那个f.seek(0),将读取文件的指针,重新定位到最开始的位置,因此两次f.read(48),得到的内容是一样的。
seek()含有一个参数,用来确定参考位置。

  • 0表示从文件头开始的绝对位置(默认)
  • 1表示以当前位置为参考,
  • 2表示从文件末尾开始。

文件对象的read()readline()readlines()

  • read()函数可以带一个长度,用来控制每次读入的内容长度,这根内容直接相关,如果读取一个超大文件,read()不带长度,程序可能直接卡死。
  • readline()函数也可以带一个长度,表示在这个长度范围内读取一行,如果读取一个超大文件,文件中没有换行符,readline()不带长度,程序可能直接卡死。
  • readlines()虽然可以让代码更易写易读,但是其实很消耗内存, read all lines into memory,如果是很大的文件,这一定不是个好的选择。当然,readlines()也可以设置一个最大读取字节数,但是readlines()函数总是会尝试读出一个完整的行出来。比如一行有10个bytes,readlines(2),也会把这10个bytes读出来。

要特别注意readline()readlines()在给定参数时的行为的不同!

read()

Python文件对象的read()函数很直接,就是读,如果不带参数,一口气就将文件内容全部读出来了。不过也可以带个参数,限制一下每次读取的长度。

>>> f = open('test.txt')
>>> f.read()
'12345\nabcde\n14sdn854nd\nhahaha..\n'
>>> f.seek(0)
0
>>> f.read(5)
'12345'
>>> f.read(5)
'\nabcd'
>>> f.read(5)
'e\n14s'
>>> f.read(5)
'dn854'
>>> f.read(5)
'nd\nha'

read()函数不带参数,就是将文件内容全部读出;参数表示读取的字节数。

readline()

顾名思义,这个函数的作用就是读取文件的一行。

>>> f.seek(0)
0
>>> f.readline()
'12345\n'
>>> f.readline()
'abcde\n'
>>> f.readline()
'14sdn854nd\n'
>>> f.readline()
'hahaha..\n'
>>> f.readline()
''

readline()的逻辑是,读取到EOF或换行为止,因此所以,readline()函数也没有带一个参数,参数含义跟read()一样,表示读取的最大字节数。不过,遇到换行或EOFreadline()会返回。

>>> f.seek(0)
0
>>> f.readline(2)
'12'
>>> f.readline(2)
'34'
>>> f.readline(2)
'5\n'
>>> f.readline(2)
'ab'
>>> f.readline(2)
'cd'
>>> f.readline(2)
'e\n'
>>> f.readline(2)
'14'
>>> f.readline(2)
'sd'
>>> f.readline(2)
'n8'
>>> f.readline(2)
'54'
>>> f.readline(2)
'nd'
>>> f.readline(2)
'\n'

readlines()

readlines()与上一个函数的区别,在于它将文件所有的行一次性读出来后,放入一个list对象中,在有循环操作的时候,这个函数用起来更方便。

>>> f.seek(0)
0
>>> f.readlines()
['12345\n', 'abcde\n', '14sdn854nd\n', 'hahaha..\n']
>>> f.tell()
32

read()不带参数一样,一口气将文件读完,指针位置移动到文件最后,只是返回的是按行的list。其实,readlines()函数也可以带一个参数,参数的含义依然是字节数,不过函数的行为不是读取参数指定的字节数,而是读取符合指定字节数的行出来。请看如下代码:

>>> f.seek(0)
0
>>> f.readlines(10)
['12345\n', 'abcde\n']
>>> f.readlines(2)
['14sdn854nd\n']
>>> f.readlines(200)
['hahaha..\n']
>>> f.readlines(200)
[]
>>> f.close()

参数为10时,两行就满足了;参数为2时,只需要一行就满足了;参数为200时,遇到了EOF,只剩一行了;最后没有了,就返回空的list对象。

本文的测试代码一致使用f.seek(0)进行文件内容的重新读取,最后别忘了f.close()关闭文件。

参考

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《Python进阶系列》六:Python中的文件对象 的相关文章

随机推荐

  • 数字图象处理之二维码图像提取算法(六)

    整体的框图如下所示 Hough 变换是图像空间和参数空间之间的一种变换 利用点与线的对偶性 将原始图像空间的给定曲线变为参数空间的一个点 这样直线的检测就变为参数空间中峰值的检测 接下来来了解一下霍夫变换 可以证明 直角坐标系p 0中的一条
  • 简单排序--冒泡排序(一)

    冒泡排序算法运行起来非常缓慢 但在概念上它是排序算法中最简单的 因此冒泡排序算法在刚开始研究排序技术时是一个非常好的算法 使用冒泡排序对无序数据进行排序 如下图冒泡排序的执行过程如下 从数组的最左边开始 比较0号位置和1号位置的数字 如果左
  • 图像分类之花卉图像分类(二)数据预处理代码

    经过上一节数据增强 我们来说说数据预处理吧 首先我们要知道图片进入网络训练都是要统一大小格式的 所以我们需要对训练集和验证集的图片进行裁剪 让他们大小统一 注意测试集不用裁剪 我选择裁剪成了64 64的 没改源码的裁剪大小 其实图片大些识别
  • Win10启动Celery报错解决方案 Task handler raised error: ValueError: not enough values to unpack

    一 异常现象 Windows 在开发 Celery 异步任务 通过命令celery A celery task worker l info启动 Celery 服务后正常 但在使用 delay 调用任务时会出现以下报错信息 Task hand
  • 【Windows】网线直连实现两台电脑共享文件夹

    目录 前言 1 用网线连接两台电脑 1 1 查看是否连接成功 2 设置两台电脑的 IP 网络类型和工作组 2 1 设置 Win10 的 IP 2 2 查看 Win10 的 IP 2 3 再次设置 Win10 的网关 2 4 再次查看 Win
  • physx-3.4.1官方文档

    https docs nvidia com gameworks content gameworkslibrary physx guide Manual GeometryQueries html https documentation hel
  • ERROR: Unexpected bus error encountered in worker. This might be caused by insufficient shared memor

    在Docker容器中利用Pytorch训练模型的时候 出现了题目中的错误 ERROR Unexpected bus error encountered in worker This might be caused by insufficie
  • 【 AMEsim的安装教程】

    AMEsim的安装教程 AMEsim2021 1安装包百度网盘链接 链接 https pan baidu com s 1WwDbD1v7TGqxu6G0Nfm9Zw pwd gyg6 提取码 gyg6 1 下载完所有压缩包后 解压第一个压缩
  • MD5碰撞

    前言 在CTF中可以说是经常碰到md5加密了 一般都是进行强比较抑或是弱比较 考法非常多 但是万变不离其中 只要我们掌握了原理 一切问题便迎刃而解了 文章首发于 我的博客 格式可能比较清晰 有兴趣了解CTF中MD5碰撞的伙伴可以移步查看 简
  • Causal Inference

    文章目录 Standardization 非参数情况 Censoring 参数模型 Time varying 静态 IP weighting 无参数 Censoring 参数模型 censoring 条件下 V Time varying G
  • 计算二叉树的深度,结点的个数。

    计算二叉树的深度 结点的个数 算法5 5 计算二叉树的深度 结点的个数 include
  • 调用外部的搜索引擎(百度和Google)

    调用的百度和Google的代码如下
  • 程序员常用的10个Linux命令

    本文将为开发者分享10个有用的Linux命令 希望对你会有所帮助 以下就是今天我们要介绍的Linux命令 man touch cat and less sort and grep cut sed tar find diff uniq chm
  • 【生产篇】_Oracle ADG同步技术 ——DBA必备的一种“后悔药”

    note taker Ethan Yang recording time 2019 09 23 number of docs 11 引言 所有高可用性方案的本质就是 冗余 当然预算开支也会随着高可用性要求的提升而变得异常昂贵 大家在构建数据
  • 配置apache2.4.46虚拟目录

    配置虚拟目录 修改httpd conf 定位IfModule alias module这个模块 在 Alias webpath full filesystem path下按照格式改写 在模块末尾 lt Ifmodule gt 的上面加一段
  • Markdown编辑器【Typora 1.5.10】免费版下载、安装教程(亲测有效!!!)

    文章涉及Markdown版本为1 5 10 一 简介 1 Typora是一款非常好用的 Markdown 编辑器和阅读器 2 支持实时预览的轻量级 Markdown 编辑器 二 安装包及所涉及插件下载 阿里云盘 https www aliy
  • 测试面试LeetCode系列:一维数组的动态和

    每日一刷的LeetCode题目又来了 寒冬之下 助你拿一个大厂的测开offer 给你一个数组 nums 数组 动态和 的计算公式为 runningSum i sum nums 0 nums i 请返回 nums 的动态和 示例 1 输入 n
  • Qualcomm AR SDK之替换模型(已解决模型贴图问题)

    ARVR技术交流群 129340649 欢迎加入 求从事移动应用开发以及基于移动终端的AR应用开发的朋友 一起做一些事 有兴趣可以给我私信 谢谢 1 将模型转换为 obj格式 这个通过很多三维软件都可以实现 我用的是3Dmax 2 将obj
  • Flutter上你需要一个简单实用的验证码输入Widget

    现在很多app都有填写验证码的需求 而这个验证码的UI流行非普通的输入框 毕竟移动开发主要矛盾是设计师日益增长的天马行空同落后的开发之间的矛盾 作为跨平台方案的Flutter自然也会用到这种控件 本着少造轮子 多copy的原则 想去找个验证
  • 《Python进阶系列》六:Python中的文件对象

    文件对象的seek 和tell 打开一个文件 读取内容 是很常见的操作 不过有的时候我们还需要反复读取文件中的内容 如果多次打开文件读取再多次关闭 显然不是特别好的操作 我们可以借助Python文件对象的seek 和tell 函数 来实现反