Ogni file è formato da una sequenza arbitrariamente lunga di byte. Usare un file in modalità binaria significa leggere o scrivere direttamente la sequenza di byte di cui è composto.
Definire un oggetto file assegnandolo ad una variabile, indicando il percorso/nome del file reale e il modo di accesso ("rb" = lettura, "wb" = scrittura). Per indicare il percorso di un file su sistemi Windows è molto importante utilizzare stringhe raw in modo da non considerare i caratteri \ come l'inizio di una sequenza di escape:
my_file = open(r"c:\dati.dat", "rb")
I dati sono rappresentati da una stringa binaria in Python2 o da un oggetto bytes in Python3:
my_file.write(dati)
I dati ritornati da read sono sotto forma di stringa binaria in Python2 o oggetto bytes in Python3.:
dati = my_file.read() # Legge tutto il file dati = my_file.read(1) # Legge un byte dati = my_file.read(1000) # Legge 1000 bytes
my_file.close()
import struct import random dati = [random.randint(0, 255) for _ in range(256)] # Lista interi random dati = struct.pack("B"*len(dati), *dati) # Sequenza binaria open("dati.dat", "wb").write(dati) # Scrittura su disco dati = open("dati.dat", "rb").read() # Rilettura dati = struct.unpack("B"*len(dati), dati) # Tupla di interi print("Dati letti = %d\n" % len(dati)) for i in range(0, len(dati), 16): chunk = dati[i:i+16] print(" ".join("%02X" % n for n in chunk))
open("dati.dat", "wb").write("".join(chr(randint(0, 255)) for _ in range(256))) # Py2
open("dati.dat", "wb").write(bytes(randint(0, 255) for _ in range(256))) # Py3
Un file di testo è composto da sequenze di byte ottenute dalla codifica delle relative stringhe di caratteri delle righe del testo, separate da appositi byte di fineriga. Nella gestione binaria dei file testuali occorre farsi carico esplicitamente e totalmente della gestione dei fineriga e dell'encoding.
# Codice Python3 fineRiga = "\r\n".encode("utf-8") # Fine riga Windows righe = ( "Nel mezzo del cammin di nostra vita", "mi ritrovai per una selva oscura", "ché la diritta via era smarrita.", "Ahi quanto a dir qual era è cosa dura", "esta selva selvaggia e aspra e forte", "che nel pensier rinova la paura!" ) f = open("commedia.txt", "wb") for riga in righe: riga = riga.encode("utf-8") f.write(riga + fineRiga) f.close()
fineRiga = "\r\n".encode("utf-8") # Fine riga Windows dati = open("commedia.txt", "rb").read() righe = dati.split(fineRiga) for riga in righe: riga = riga.decode("utf-8") print(riga)
Per indicare esattamente la sequenza di byte di fineriga del proprio sistema operativo si può usare il modulo os:
import os
fineRiga = os.linesep.encode("utf-8")
import io buffer = io.BytesIO() stringa = "W Python!\n" buffer.write(stringa.encode("utf-8")) buffer.seek(0) stringa = buffer.read().decode("utf-8") buffer.close()