说明
文件指针式指向当前字节的位置,当mode=r时,指针起始在0;mode=a时,指针起始位置在EOF。
tell()
tell()显示当前指针位置
代码语言:javascript复制In [47]: f = open('test')
In [49]: f.tell()
Out[49]: 0
seek()
seek()移动文件指针的位置,offest设置偏移多少个字节,whence表示从哪里开始偏移。
代码语言:javascript复制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的时候,不能超界,否则抛出异常。