专栏首页运维技术迷[Python笔记] 文件指针

[Python笔记] 文件指针

说明

文件指针式指向当前字节的位置,当mode=r时,指针起始在0;mode=a时,指针起始位置在EOF。

tell()

tell()显示当前指针位置

In [47]: f = open('test')                                                                                           
In [49]: f.tell()                                                                                                   
Out[49]: 0

seek()

seek()移动文件指针的位置,offest设置偏移多少个字节,whence表示从哪里开始偏移。

seek(offest[,whence])

文本模式下,whence取值范围及释义如下:

参数

释义

whence

0

缺省值,表示从头开始,offest值只能是正整数

whence

1

表示从当前位置开始,offest值只接受0

whence

2

表示从EOF位置开始,offest值只接受0

# 文本模式
In [62]: f = open('test4','r+')                                                                                     

In [63]: f.tell()                                                                                                   
Out[63]: 0

In [64]: f.read()                                                                                                   
Out[64]: 'addbsa 12323 \\nwqeqweqw\n'

In [65]: f.tell() # 获取当前文件指针位置                                                                                                  
Out[65]: 24

In [67]: f.seek(0)   # 设置文件指针为0,也就 从头开始                                                                                               
Out[67]: 0

In [68]: f.read()   # 从新read就是从头开始读取                                                                                                
Out[68]: 'addbsa 12323 \\nwqeqweqw\n'

In [69]: f.seek(2,0)  # 从EOF位置开始偏移2个字符位置                                                                                             
Out[69]: 2

In [70]: f.read()                                                                                                   
Out[70]: 'dbsa 12323 \\nwqeqweqw\n'

In [71]: f.seek(2,1)   # offest只接受0                                                                                             
---------------------------------------------------------------------------
UnsupportedOperation                      Traceback (most recent call last)
<ipython-input-71-ad0d3a1f89a7> in <module>
----> 1 f.seek(2,1)

UnsupportedOperation: can't do nonzero cur-relative seeks

In [72]: f.seek(2,2)                                                                                                
---------------------------------------------------------------------------
UnsupportedOperation                      Traceback (most recent call last)
<ipython-input-72-c79d1a6e2c76> in <module>
----> 1 f.seek(2,2)

UnsupportedOperation: can't do nonzero end-relative seeks

In [73]: f.close()        

# 中文
In [74]: f = open('test4','w+')                                                                                     

In [75]: f.write('连仕彤博客')                                                                                      
Out[75]: 5

In [76]: f.tell()                                                                                                   
Out[76]: 15

In [77]: f.close()                                                                                                  

In [78]: f = open('test4','r+')                                                                                     

In [79]: f.read(3)                                                                                                  
Out[79]: '连仕彤'

In [80]: f.seek(1)                                                                                                  
Out[80]: 1

In [81]: f.tell()                                                                                                   
Out[81]: 1

In [82]: f.read()                                                                                                   
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-82-571e9fb02258> in <module>
----> 1 f.read()

~/.pyenv/versions/3.5.3/lib/python3.5/codecs.py in decode(self, input, final)
    319         # decode input (taking the buffer into account)
    320         data = self.buffer + input
--> 321         (result, consumed) = self._buffer_decode(data, self.errors, final)
    322         # keep undecoded input until the next call
    323         self.buffer = data[consumed:]

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byte

In [83]: f.seek(2)                                                                                                  
Out[83]: 2

In [84]: f                                                                                                          
Out[84]: <_io.TextIOWrapper name='test4' mode='r+' encoding='UTF-8'>

In [85]: f.close()              

二进制模式下,whence取值范围及释义如下:

参数

释义

whence

0

缺省值,表示从头开始,offest值只能是正整数

whence

1

表示从当前位置开始,offest值可正可负

whence

2

表示从EOF位置开始,offest值可正可负

In [103]: f = open('test4','rb+')                                                                                   

In [104]: f                                                                                                         
Out[104]: <_io.BufferedRandom name='test4'>

In [105]: f.tell()  # 起始位置                                                                                                
Out[105]: 0

In [106]: f.read()                                                                                                  
Out[106]: b'aaabbbccc'

In [107]: f.tell()                                                                                                  
Out[107]: 9

In [108]: f.write(b'abc')                                                                                           
Out[108]: 3

In [109]: f.seek(0)   # 起始位置                                                                                               
Out[109]: 0

In [110]: f.seek(2,1)  # 从当前指针位置开始,向后2                                                                                             
Out[110]: 2

In [111]: f.read()                                                                                                  
Out[111]: b'abbbcccabc'

In [112]: f.seek(-2,1)    # 从当前位置开始,向前2                                                                                         
Out[112]: 10

In [113]: f.read()                                                                                                  
Out[113]: b'bc'

In [114]: f.tell()                                                                                                  
Out[114]: 12

In [115]: f.seek(2,2)    # 从EOF位置开始,向后2                                                                                           
Out[115]: 14

In [116]: f.seek(0)                                                                                                 
Out[116]: 0

In [117]: f.seek(-2,2)    # 从EOF位置开始,向前2                                                                                          
Out[117]: 10

In [118]: f.tell()                                                                                                  
Out[118]: 10

In [119]: f.read()                                                                                                  
Out[119]: b'bc'

In [120]: f.seek(-20,2)   # OSError                                                                                       
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-120-5f6c1973901c> in <module>
----> 1 f.seek(-20,2)

OSError: [Errno 22] Invalid argument

In [121]: f.close()      

二进制模式支持任意起点的便宜,从头、从未、从中间I之开始,向后seek可以超界,但是向前eek的时候,不能超界,否则抛出异常。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [Python笔记] 文件IO常用操作

    文件操作中,最常用的操作就是读和写; 文件访问的模式有昂中:文本模式和二进制模式。不同模式下,操作函数不尽相同,表现的结果也不一样。

    行 者
  • [Python笔记] 文件操作之buffering

    buffer缓冲区是内存上的一个空间,一般爱说是一个FIFO队列,当达到缓冲区阀值或者缓冲区满了之后,数据才会flush到磁盘(也就是常说的落到磁盘上)

    行 者
  • 连仕彤博客[Python笔记] Python内置数据结构之字符串

    行 者
  • python基础教程:dict(字典)

    字典(dict, dictionary的简写)是Python中另一个非常重要的内置数据类型,是Python中映射类型(Mapping Type),它把“键”(k...

    一墨编程学习
  • 干货!Python常用数据类型的基本操作(长文系列第一篇)

    Python基础系列会将基础内容大致分为四到五个板块,每篇文章着重讲一方面,知识不会很难,主要是以小例子的形式解读,如果你已经入门Python,希望可以帮你温习...

    奶糖猫
  • Python之匿名函数

    Python之匿名函数 今天给大家介绍一下Python中的匿名函数。 匿名函数 由关键字来定义 参数列表不需要小括号 冒号不是开启新的语句块的 只能写在一行上 ...

    企鹅号小编
  • Python 深拷贝、浅拷贝

    从上面的示例来看,b = a 与 c = copy.copy(a) 这两种方式下,b 与 a 的内存地址都是 140490275823112 ,但是 c 的内存...

    Devops海洋的渔夫
  • python3之元组

    元组存在的意义,有很大一部分是因为,由于它的不可变,可以当做映射的key值,但是list就不不行

    py3study
  • 《利用Python进行数据分析·第2版》第3章 Python的数据结构、函数和文件3.1 数据结构和序列3.2 函数3.3 文件和操作系统3.4 结论

    本章讨论Python的内置功能,这些功能本书会用到很多。虽然扩展库,比如pandas和Numpy,使处理大数据集很方便,但它们是和Python的内置数据处理工具...

    SeanCheney
  • python技巧 合并两个字典

    py3study

扫码关注云+社区

领取腾讯云代金券