Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2023-24 loggatevi e attivatelo nella vostra pagina dei corsi preferiti. A quel punto il corso appare nel menù personale cliccando sul proprio avatar. Per i materiali degli anni precedenti seguite lo stesso metodo.

To join the Programming/Lab 2023-24 course, log-on and select it on the my courses page. It will appear on the personal menu of your avatar. For earlier years use the same method.

Modalità usate per i file

francesco.dev (33560 points)
21 51 129
in Programmare in Python by (33.6k points)

Ciao a tutti!

Incuriosito da come Python permette di interagire con i file, attraverso la lettura e la scrittura, mi sono imbattuto in "modalità" che non ho mai visto in altri linguaggi, mi spiego meglio:
Sappiamo che in Python per leggere un file dobbiamo aprire tale file in modalità r (read, lettura) e se vogliamo scrivere su di esso dobbiamo aprirlo in modalità w (write, scrittura) oppure a (append, scrivere nell'ultima riga e quindi di seguito senza sovrascrivere il file).

Ora la mia domanda è legata al fatto che esistano modalità differenti da queste, come: r+, w+, a+!

Ho scoperto che r+ permette di aprire un file sia in modalità lettura che scrittura, ma gli altri due??

Spero che chi mi risponda abbia familiarità con queste modalità, perché:

  • vorrei capire bene la differenza tra queste tre modalità (r+, w+, a+);
  • perché adoperarne una invece di un'altra;
  • il motivo principale per cui esistono tali modalità oltre a quelle di default (r, w, a).

Grazie in anticipo!

- Francesco Pio Scognamiglio

949 views
closed

3 Answers

Best answer
split (8700 points)
21 59 79
by (8.7k points)
selected by
allora, ti linko una risposta di stackoverflow dove ho trovato una domanda uguale alla tua

https://stackoverflow.com/questions/1466000/python-open-built-in-function-difference-between-modes-a-a-w-w-and-r

e relativa risposta.

la differenza fondamentale tra w+ e r+ è che con w+ il file viene creato anche se non esiste, con r+ invece devi aprire un file che esiste già e che magari vuoi modificare. a+ fa la stessa cosa di w+ ma con solo la possibilità di aggiungere cose, come hai già detto tu.
francesco.dev (33560 points)
21 51 129
by (33.6k points)
Grazie per aver linkato la risposta, molto interessante!
split (8700 points)
21 59 79
by (8.7k points)
di niente, se hai ancora dubbi chiedi pure
Gabriele97 (2010 points)
12 29 38
by (2.0k points)
Ciao;
già  sai che quelli che hai elencato sono modi con cui la funzione open() restituisce un oggetto file, con sintassi open(nome file, modo)
Il primo argomento è una stringa contenente il nome del file.
 Il secondo è un'altra stringa contenente pochi caratteri che descrivono il modo nel quale verrà usato il file,  esso sarà 'r' (`read') quando il file verrà solamente letto, 'w' per la sola scrittura (`write'),quello che aggiungo, imparato a mie spese in questi giorni è che in caso esista già un file con lo stesso nome, esso verrà cancellato, mentre 'a' aprirà il file in ``aggiunta'' (`append'): qualsiasi dato scritto sul file verrà automaticamente aggiunto alla fine dello stesso. 'r+' aprirà il file sia in lettura che in scrittura. L'argomento modo è facoltativo; in caso di omissione verrà assunto essere 'r' di default.
Documentandomi ho scoperto che su Windows ,penso anche su Macchintosh,  'b' aggiunto al modo apre il file in modo binario, per cui ci sono ulteriori modi come 'rb', 'wb' e 'r+b'.
Su questo metodo di aprire in binario un file non so dirti di più ancora, è un concetto che ancora devo approfondire!

Sperando di essereti stato d aiuto!
francesco.dev (33560 points)
21 51 129
by (33.6k points)
Molto interessante! Grazie per la tua risposta!
LeonardoEmili (35740 points)
13 65 155
by (35.7k points)

Ciao!
Questi che hai elencato tu sono tutti i modi in cui la funzione open() può interagire col tuo file. Specifico interagire proprio perché la funzione open() non si limita alla mera apertura del file, bensì rende possibili molte altre operazioni!
Come già precisato da Gabriele97 la sintassi della funzione open() è : primo argomento accetta una stringa dove verrà scritto il nome del file da aprire, e come secondo parametro un'altra stringa dove andrai effettivamente a specificare l'operazione da fare su quel file , o se vuoi come vuoi aprirlo.
Infatti di default questa è 'r' ma può variare come già precisato da split e Gabriele97, mi limito quindi a fornirti altre informazioni che reputo ti saranno molto utili nell'utilizzo di quest'ultime. Il metodo 'r+' ti permette di aprire il file in lettura e scrittura, il metodo 'w' ti fa scrivere su di esso ma attenzione perché qui la scrittura è intesa come sovrascrittura, infatti se andrai a selezionare un file già esistente e in seguito vorrai scrivere del contenuto in esso utilizzando il metodo 'w' sovrascriverai i vecchi dati. Il metodo 'w+' utilissimo in quanto ti permette di creare il file se questo non esisteva in precedenza.
Le documentazioni online sono infinite quindi se queste info non ti bastano ti basterà cercare su internet open() python e essendo che quest'ultima fa parte delle built-in-functions dunque delle funzioni che già sono integrate in Python troverai moltissime curiosità e info.
Preciso infine che il suddetto metodo 'b' altro non è che un informazione in più da passare alla funzione,  portandoti un esempio se vuoi copiare un file .jpg dovrai aprire il file.jpg aggiungendo la b, quindi ad esempio 'rb' e scrivere sul nuovo file aggiungendo la stessa 'b', quindi ad esempio 'w+b'. Tale parametro ti è di fondamentale importanza nell'apertura di file di questo tipo (ma anche per quanto riguarda gli .exe) che non vanno interpretati come sequenze di caratteri bensì si effettua la cosiddetta "read binary file" ovvero lettura di file in binario.

Sperando di averti aiutato, ti auguro una buona giornata.

Leonardo Emili

francesco.dev (33560 points)
21 51 129
by (33.6k points)
Grazie anche della tua risposta!
LeonardoEmili (35740 points)
13 65 155
by (35.7k points)
Di nulla figurati!!