随机存取

文件操作中,read()和write()都属于顺序存取,只能按顺序从头到尾的进行读写。实际上我们可以只访问文件中我们感兴趣的部分。对此,我们可以使用seek()和tell()方法。两种方法的help()返回结果如下。

 >>> f = open("demo.txt","w")
>>> f.write("")
10
>>> f.close()
 >>> help(f.seek)
Help on built-in function seek: seek(cookie, whence=0, /) method of _io.TextIOWrapper instance
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.
 >>> help(f.tell)
Help on built-in function tell: tell() method of _io.TextIOWrapper instance
Return current stream position.

seek的第一个参数——cookie——用来指示相对位移,可正可负可零,受限于第二个参数。必需。

seek的第二个参数——whence——用来指示参照物,0(io.SEEK_SET)代表文件开头,1(io.SEEK_CUR)代表当前位置,2(io.SEEK_END)代表文件末尾。默认为0。

 >>> f = open("demo.txt","r")
>>> f.seek(0)
0
>>> f.seek(-1)
Traceback (most recent call last):
File "<pyshell#135>", line 1, in <module>
f.seek(-1)
ValueError: negative seek position -1
>>> f.seek(1)
1

默认/whence=0情况,相对位移只能为零或正数。

 >>> f = open("demo.txt","r")
>>> f.seek(0,1)
0
>>> f.seek(-1,1)
Traceback (most recent call last):
File "<pyshell#126>", line 1, in <module>
f.seek(-1,1)
io.UnsupportedOperation: can't do nonzero cur-relative seeks
>>> f.seek(1,1)
Traceback (most recent call last):
File "<pyshell#127>", line 1, in <module>
f.seek(1,1)
io.UnsupportedOperation: can't do nonzero cur-relative seeks

当前/whence=1情况,相对位移只能为零。这是令人感到奇怪的,原因会在后面讲。

 >>> f = open("demo.txt","r")
>>> f.seek(0,2)
10
>>> f.seek(-1,2)
Traceback (most recent call last):
File "<pyshell#119>", line 1, in <module>
f.seek(-1,2)
io.UnsupportedOperation: can't do nonzero end-relative seeks
>>> f.seek(1,2)
Traceback (most recent call last):
File "<pyshell#120>", line 1, in <module>
f.seek(1,2)
io.UnsupportedOperation: can't do nonzero end-relative seeks

末尾/whence=2情况,相对位移只能为零。这同样令人感到奇怪,原因会在后面讲。

问题

比较help文档的内容和我们前面所得,我们知道whence=1或2时,表现与预期不相符。这是由于打开方式的问题。以“t”方式(文本模式)打开的文件是无法从当前位置或末尾位置开始计算位移的,只允许从开头位置开始计算位移。注意观察上面代码的异常信息。第一段代码中报ValueError异常,而后面的报io.UnsupportedOperation异常。显然异常不同,造成异常的原因也不同。

想要从当前或末尾位置开始计算位移,应当使用“b”方式(二进制模式)打开文件。

 >>> f = open("demo.txt","rb")
>>> f.seek(0)
0
>>> f.seek(-1)
Traceback (most recent call last):
File "<pyshell#106>", line 1, in <module>
f.seek(-1)
OSError: [Errno 22] Invalid argument
>>> f.seek(3)
3
>>> f.seek(0,1)
3
>>> f.seek(-1,1)
2
>>> f.seek(1,1)
3
>>> f.seek(0,2)
10
>>> f.seek(-1,2)
9
>>> f.seek(1,2)
11

Python-基础-文件操作-随机存取的更多相关文章

  1. python基础-文件操作

    一.文件操作 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作. 打开文件的模式有: r ,只读模式[默认模式,文件必须存在,不存在则抛出异 ...

  2. python基础-文件操作(10)

    一.什么是文件 等等这些都叫做文件,各种格式的.但不仅仅限制于这些. 二.文件的作用 大家应该听说过一句话:“好记性不如烂笔头”. 不仅人的大脑会遗忘事情,计算机也会如此,比如一个程序在运行过程中用了 ...

  3. Python基础--文件操作和集合

    这篇博客来说一下python对文件的操作. 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句柄操作文件 3.关闭文件. 现有以下文件file.txt: 我们哭了 ...

  4. python 基础文件操作

    实时刷新到硬盘里 f= open('hh','w',encoding='utf8') f.write('gyftyftft') f.write('hghgh\njkkjk') f.flush()#实时 ...

  5. Python 基础 文件操作

    字符串与字节之间的转换 # utf-8 一个汉字 占三个字节 # gbk 一个汉字 占两个字节 # 字符串转换成字节 print(bytes('汉字', encoding='utf-8'))print ...

  6. python基础--文件操作实现全文或单行替换

    python修改文件时,使用w模式会将原本的文件清空/覆盖.可以先用读(r)的方式打开,写到内存中,然后再用写(w)的方式打开. 替换文本中的taste 为 tasting Yesterday whe ...

  7. Python基础————文件操作

    文件操作 4.1 文件基本操作 obj = open('路径',mode='模式',encoding='编码') # 表示要干嘛 读 还是写 obj.write() #写什么内容 obj.read() ...

  8. Python基础—文件操作(Day8)

    一.文件操作参数 1.文件路径 1)绝对路径:从根目录开始一级一级查找直到找到文件. f=open('e:\文件操作笔记.txt',encoding='utf-8',mode='r') content ...

  9. python基础 — 文件操作

    读取键盘输入 Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘.如下: raw_input input raw_input函数 raw_input([prompt]) 函数从 ...

  10. Python基础-文件操作(七)

    一.文件基本操作 1.open 打开模式: w模式 写模式write 文件不存在时会创建文件,如果文件已存在则会清空文件 r模式 读模式read 文件不存在就报错,存在则准备读取文件 a模式 追加模式 ...

随机推荐

  1. 2 ArrayList 详解

    List 是有序.可重复的容器.List中每个元素都有索引标记,可以根据元素的索引标记访问元素,从而精确控制这些元素. List 接口常用的实现类:ArrayList.LinkedList.Vecto ...

  2. 炉石兄弟 修复图腾师问题 by大神beebee102, 还有阴燃电鳗

    修复图腾师问题   beebee102 修复了先摇图腾再下图腾师的问题,另外加了阴燃电鳗的sim卡.在兄弟策略的模拟程序中测试了没问题,真机没有试过,麻烦吧友测试了回复一下.链接: [有效] http ...

  3. 在 bat 批处理中运行多次 mvn

    在 bat 中运行 mvn 命令会出现这种情况,构建命令执行完成后会停留在的 mvn.bat 中,必需手工输入 exit 后,才会回到原来的脚本中继续运行.这是怎么回事? 到 maven 的安装目录下 ...

  4. HttpURLConnection获取数据

    使用步骤: 1.创建Url 2.用Url打开连接 3.设置请求参数 4. 获取响应状态码 2xxx 请求成功 3xxx重定向 4xxx资源错误 5xxx服务器错误 5.获取服务器返回的二进制输入流 6 ...

  5. python函数的执行过程

    对于 Python 常规函数,都只有一个入口,但会有多个出口如 return 返回或者抛出异常.函数从入口进入会一直运行到 return 语句或者抛出异常,中间不会暂停,函数一直拥有控制权.当运行结束 ...

  6. 浏览器输入url后发生的事情以及每步可以做的优化

    首先总结下输入url按下回车后的大致流程: 查询url的ip地址. 建立tcp连接,连接服务器. 浏览器发起http/https请求. 服务器响应浏览器的请求. 网页的解析与渲染. 下面分析每个过程 ...

  7. 分布式存储ceph部署(2)

    一.部署准备: 准备5台机器(linux系统为centos7.6版本),当然也可以至少3台机器并充当部署节点和客户端,可以与ceph节点共用:     1台部署节点(配一块硬盘,运行ceph-depo ...

  8. Threadlocal源码分析以及其中WeakReference作用分析

    今天在看Spring 3.x企业应用开发实战,第九章 Spring的事务管理,9.2.2节ThreadLocal的接口方法时,书上有提到Threadlocal的简单实现,我就去看了下JDK1.8的Th ...

  9. jenkins打开空白页

    1.登录jenkins报错提示hudson.security.AccessDeniedException 解决: 修改Jenkins_home/config.xml文件里面的一段内容改成如下 < ...

  10. 产品之我见(3)-ZEN在产品上的延伸

    ZEN 在WIKIPEDIA上的解释是这样的: 禅,禅宗强调严格的自我控制能力,冥想实践,洞察到的事物性质,而这种洞察力在日常生活中的个人表达,尤其是为了别人的利益. 因此,它不再强调对经典和学说的了 ...