16

I want to specify an offset and then read the bytes of a file like

offset = 5
read(5) 

and then read the next 6-10 etc. I read about seek but I cannot understand how it works and the examples arent descriptive enough.

seek(offset,1) returns what?

Thanks

inspectorG4dget
  • 110,290
  • 27
  • 149
  • 241
user3124171
  • 401
  • 2
  • 7
  • 19
  • 2
    A hint: make sure you open the file for binary access, for example: `open(filename, 'rb')`. – cdarke Mar 31 '15 at 19:11

3 Answers3

17

The values for the second parameter of seek are 0, 1, or 2:

0 - offset is relative to start of file
1 - offset is relative to current position
2 - offset is relative to end of file

Remember you can check out the help -

>>> help(file.seek)
Help on method_descriptor:

seek(...)
    seek(offset[, whence]) -> None.  Move to new file position.

    Argument offset is a byte count.  Optional argument whence defaults to
    0 (offset from start of file, offset should be >= 0); other values are 1
    (move relative to current position, positive or negative), and 2 (move
    relative to end of file, usually negative, although many platforms allow
    seeking beyond the end of a file).  If the file is opened in text mode,
    only offsets returned by tell() are legal.  Use of other offsets causes
    undefined behavior.
    Note that not all file objects are seekable.
Brian Burns
  • 20,575
  • 8
  • 83
  • 77
15

Just play with Python's REPL to see for yourself:

[...]:/tmp$ cat hello.txt 
hello world
[...]:/tmp$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open('hello.txt', 'rb')
>>> f.seek(6, 1)    # move the file pointer forward 6 bytes (i.e. to the 'w')
>>> f.read()        # read the rest of the file from the current file pointer
'world\n'
Santa
  • 11,381
  • 8
  • 51
  • 64
  • 1
    while True: fo.seek(offset,1) b = fo.read() print b by doing that b prints all the bytes except the first "offset" ones... I am just confused... – user3124171 Mar 31 '15 at 19:14
  • 3
    OP does not specify from whence the offset is calculated. If it's the beginning of the file, it should be `f.seek(6, 0)` or just `f.seek(6)`. Here it will make no difference because there were no intermediate reads on the open file to change the current stream position. Since the OP wants the next five characters after an offset of six the read should probably be `f.read(5)`. – Steven Rumbalski Mar 31 '15 at 19:15
3

seek doesn't return anything useful. It simply moves the internal file pointer to the given offset. The next read will start reading from that pointer onwards.

Bryan Oakley
  • 370,779
  • 53
  • 539
  • 685