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

Do you need help?

Notice Board

Funzione open()

Gabriele97 (2010 points)
12 29 38
in Programmare in Python by (2.0k points)
Ciao a tutti;

stavo studiando la funzione open() per interagire con il filesystem, ho ragionato sui diversi modi per invocarla, testuale e binario. Ho poi cominciato a vedere come potevo interagire con i file object che restituisce e alcuni tra i primi esempi di metodi che mi sono stati proposti sono stati file.readline(), file.writeline() e file.tell().

Qualcuno può spiegarmi in che modo vanno utilizzati e cosa restituiscono?

Grazie in anticipo.
1.2k views
closed

2 Answers

Best answer
LeonardoEmili (35740 points)
14 65 155
by (35.7k points)
selected by

Ciao!

Tali metodi sono di vitale importanza in Python in quanto potenti strumenti con cui interagire con i file.
Concordo con quello già detto da francesco.dev  daniele.gargano e mi permetto di precisare alcuni punti.
Il metodo .writeline() non esiste, bensì esso è .writelines(). Tale metodo risulta essere una variante del metodo .write() che permette di scrivere il valore delle stringhe inserite all'interno del file, ti ricordo che tale metodo accetta come parametro solamente stringhe, dunque se vuoi inserire altri tipi di valori dovrai effettuarne la conversione con l'apposita funzione str(). La principale differenza tra i due sta nel fatto che il metodo .write() si aspetta una singola scritta da inserire nel file, mentre il metodo .writelines() si aspetta una lista di stringhe. Entrambi i metodi restituiscono come valore None.
Inoltre sia metodo .read() sia .readline() si aspettano di ricevere 3 parametri, di cui le prime due sono fondamentali: il primo parametro è il nome del file che vuoi aprire, il secondo che metodo vuoi usare per aprirlo (di default 'r' ma ti faccio presente che può essere aperto anche con i metodi 'w','r+', e le varie varianti per la lettura in binario del file).
Concludendo vorrei ora suggerirti alcuni piccoli consigli su cui prestare attenzione e che ho imparato "a mie spese" : specificando come 2° parametro 'w' col metodo .write() fai bene attenzione perché stai sovrascrivendo il file, se invece la tua intenzione era quella di aprire (quindi leggere) e scrivere su quel file utilizza invece il metodo 'r+'; potresti ricevere diversi errori se stai gestendo file di cui non hai effettivamente "il pieno controllo", un errore tipico è quello di aprire un file di cui non si gode il permesso di scrittura col metodo .read() in 'r+', se lo farai questo ti restituirà un errore poiché ti trovi nel tipico caso di "read only file".
Sperando di esserti stato d'aiuto di auguro una buona serata!
In ogni caso se vuoi spiegazioni più accurate basta semplicemente googlare in rete e troverai un'infinità di spiegazioni!

Ciao!

Leonardo Emili

Gabriele97 (2010 points)
12 29 38
by (2.0k points)
Ok grazie mille tutto chiaro, una cosa soltanto mi sfugge, quando hai parlato dei metodi .write() e .writelines() hai detto che entrambi restituiscono come valore none.
Mi spieghi meglio?
Io ho riscontrato questo valore anche lavorando con i cicli, immagino sia una variabile che alla fine del loop rimane vuota; e corretto?
LeonardoEmili (35740 points)
14 65 155
by (35.7k points)
Si guarda entrambi i metodi restituiscono None come valore. Se ben ricordi una funzione ritorna il valore None quando in essa non viene specificato cosa ritornare o il "return" viene omesso. Ti ricordo infine che None è un tipo di dato in Python tanto quanto int o str, lo puoi verificare assegnando a una variabile il valore None ('N' maiuscola)  e printandone il risultato e tanto più facendo lo stesso stampando però il type della variabile riceverai il tipo "NoneType".
francesco.dev (33560 points)
23 51 129
by (33.6k points)
edited by
Ciao Gabriele97!

Allora:
Queste funzioni ti permettono di svolgere delle operazioni molto importanti sui file: la lettura, la scrittura e la chiamata!

Mi spiego meglio:
- file.readline() ti permette di leggere una riga del file di testo! Quindi, per leggere tutto il file, dovrai fare un ciclo e leggere riga per riga. Tale funzione restituisce una stringa che corrisponde alla linea richiesta;
- file.write(stringa) ti permette di scrivere una stringa, un numero, qualsiasi cosa su di un file;
- file.tell() invece ti restituisce la posizione in cui si trova l'indice di lettura o di scrittura, ovvero ti dice chiaramente in che riga stai scrivendo o leggendo.

Sperando di averti aiutato, per altro non esitare a chiedere!

- Francesco Pio Scognamiglio
daniele.gargano (1200 points)
3 7 16
by (1.2k points)
Occorre fare solo un piccolo appunto: la funzione writeline non esiste. Probabilmente hai fatto confusione con la funzione writelines, che permette di scrivere il contenuto di una lista di stringhe su un file (ogni stringa della lista su una linea propria). La funzione "standard" per scrivere in un file è la funzione write, che accetta in input una stringa e la scrive sul file, partendo dalla posizione attuale del puntatore: se il file è stato aperto in modalità "append" (aggiunta) il puntatore verrà portato automaticamente alla fine del file, consentendo di apporre del testo ad esso.
Può esserti utile informarti anche sulla funzione seek, che permette di spostare a piacimento il puntatore interno al file.

Dai un'occhiata alla documentazione ufficiale python per l'input e l'output da file: https://docs.python.org/3/tutorial/inputoutput.html
francesco.dev (33560 points)
23 51 129
by (33.6k points)
Vero! Hai ragione, mi sono semplicemente confuso con il nome di una funzione presente in un altro linguaggio, visto che in quelli che conosco ci sono le medesime funzioni, ma, come capita spesso, con nomi diversi :D!
Ti ringrazio per la piccola correzione!
daniele.gargano (1200 points)
3 7 16
by (1.2k points)
Figurati! Comunque mi riferivo maggiormente a Gabriele, soprattutto quando ho consigliato di leggere la documentazione e la funzione seek (anche perché immagino che tu non sia alle prime armi, probabilmente già conosci la funzione seek).
Buona serata!
francesco.dev (33560 points)
23 51 129
by (33.6k points)
Daniele non sono alle prime armi però penso fermamente che si possa imparare sempre di più! Quindi devi essere libero di fare qualsiasi appunto o critica, senza problemi! :)
Ormai, buongiorno :D