[Python笔记] 文件指针

  • 2019 年 12 月 5 日
  • 笔记

说明

文件指针式指向当前字节的位置,当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 \nwqeqweqwn'    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 \nwqeqweqwn'    In [69]: f.seek(2,0)  # 从EOF位置开始偏移2个字符位置  Out[69]: 2    In [70]: f.read()  Out[70]: 'dbsa 12323 \nwqeqweqwn'    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的时候,不能超界,否则抛出异常。