Het bestand “pc_binarytest.tmp” bevat een aantal geheime woorden, die je niet kunt herkennen als je de inhoud van het bestand toont. Ik gebruik ze als illustratie bij het positioneren van de pointer.

De pointer heeft in een bestand aan waar je begint met lezen of schrijven. Je kunt de pointer verplaatsen middels de seek() methode. seek() krijgt twee integer argumenten, waarvan de tweede optioneel is. Het eerste argument is de relatieve byte positie. De tweede geeft de positie aan ten opzichte waarvan het eerste argument relatief is.

Het tweede argument is 0, 1, of 2. 0 betekent “relatief ten opzichte van het begin van het bestand.” 1 betekent “relatief ten opzichte van de huidige positie van de pointer.” 2 betekent “relatief ten opzichte van het einde van het bestand.” Als je geen tweede argument opgeeft, wordt aangenomen dat het 0 is. In de os module zijn er constanten voor dit argument opgenomen: os.SEEK_SET is 0, os.SEEK_CUR is 1, en os.SEEK_END is 2.

Het eerste argument geeft aan hoeveel bytes je verwijderd moet zijn van de positie aangegeven door het tweede argument. Als het tweede argument 0 is, moet dit een positief getal zijn; als het 2 is, moet het een negatief getal zijn; als het 1 is, mag het negatief of positief zijn, afhankelijk van of je de pointer meer naar het begin of meer naar het einde wilt bewegen. Bijvoorbeeld, fp.seek(5) is gelijk aan fp.seek(5,0), en beweegt de pointer naar een positie 5 bytes verwijderd vanaf het begin van het bestand, op de zesde byte (de eerste byte die gelezen zal gaan worden als je de read() methode aanroept).

Als je wilt weten waar de pointer gepositioneerd is, kun je de tell() methode gebruiken. Zowel seek() als tell() werken ook voor tekstbestanden, maar zijn dan niet erg nuttig.

De geheime boodschap begint op positie 50, en is 23 tekens lang. De codering is zo gemaakt dat als je 128 aftrekt van de byte waardes, je de getallen krijgt die je met de ord() functie in de juiste letters kunt omzetten. Dus zo krijg je de boodschap te lezen:

fp = open( "pc_binarytest.tmp", "rb" )
print( "1. Huidige positie van de pointer is", fp.tell() )
fp.seek( 50 )
print( "2. Huidige positie van de pointer is", fp.tell() )
buffer = fp.read( 23 )
print( "3. Huidige positie van de pointer is", fp.tell() )
fp.close()

print( buffer )
s = ""
for c in buffer:
    s += chr( c-128 )
print( "De geheime boodschap is:", s )

De seek() methode is vooral nuttig als je een bestand opent in “lezen plus schrijven” modus ("r+b"). Je kunt ermee door het bestand bewegen en lezen wat je moet lezen, en (over)schrijven waar dat nodig is.

Open “pc_binarytest.tmp” in binaire “lezen plus schrijven” modus, en overschrijf de gecodeerde boodschap met de vertaling. Als je het bestand weer gesloten hebt, open het dan in tekst modus, lees de inhoud, en toon die. Als je het correct hebt gedaan, zie je twee leesbare regels. Als je het bestand per ongeluk kapot maakt, kun je het altijd opnieuw creëren.