[Python笔记] 文件指针

@lianst  November 1, 2018

说明

文件指针式指向当前字节的位置,当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取值范围及释义如下:

参数释义
whence0缺省值,表示从头开始,offest值只能是正整数
whence1表示从当前位置开始,offest值只接受0
whence2表示从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取值范围及释义如下:

参数释义
whence0缺省值,表示从头开始,offest值只能是正整数
whence1表示从当前位置开始,offest值可正可负
whence2表示从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的时候,不能超界,否则抛出异常。


添加新评论