File binari

 ☗ 

Dati binari

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.

Tipo di dati letti o scritti


Aprire il file

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")

Scrivere sul file

I dati sono rappresentati da una stringa binaria in Python2 o da un oggetto bytes in Python3:

my_file.write(dati)

Leggere dal file

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

Chiudere il file:

my_file.close()


Esempio di scrittura di un file binario di 256 byte e successiva rilettura e rappresentazione in esadecimale sulla console:

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))    





Esempi di forme oneline per creare il file di 256 byte random in un colpo solo:
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

Scrittura binaria file di testo

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()

Lettura binaria file di testo

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")


File binari simulati in memoria

L'oggetto buffer ottenuto dalla classe 'BytesIO' del modulo 'io' si comporta come un file binario e può essere usato al posto di un file reale.
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()






Riferimenti esterni moduli: [metodi stringa] [modulo struct] [built-in] [funzioni oggetto file]