INDICARE I PERCORSI DEI FILES

IL PATH

Come saprete, all'interno di un disco rigido i files sono organizzati secondo un diagramma ad albero: esiste una cartella base (non a caso detta in inglese root, radice) che contiene files ma anche altre cartelle, ognuna delle quali può contenere a sua volta altri files ed altre cartelle, e così via. Quando dobbiamo indicare ad un'applicazione un certo file da aprire o salvare, dobbiamo farle sapere in quale cartella esso si trova: questo è abbastanza semplice se usiamo le interfacce grafiche a cui siamo abituati, che ci permettono di aprire e scorrere le cartelle con qualche click del mouse, ma diventa piuttosto antipatico se dobbiamo usare un linguaggio di programmazione, nel quale dobbiamo scrivere la posizione del file sotto forma di string. Il percorso da indicare per trovare esattamente il nostro file viene indicato con il termine inglese path.

La cosa è complicata dal fatto che i diversi sistemi operativi (Windows, Linux, Mac) hanno convenzioni diverse su come si indica il path. Vediamo dapprima qualche nozione su di essi:

Ecco qualche esempio di quello che abbiamo detto sopra:

C:\Utenti\Gigi\Documenti\miofile.doc Un path assoluto in Windows (dalla root C: fino al file finale)
Documenti\miofile.doc Se sto lavorando nella cartella C:\Utenti\Gigi posso indicare stesso file con un path relativo
..\Documenti\miofile.doc Lo stesso file con un path relativo a partire da C:\Utenti\Gigi\Immagini (devo "risalire" di una cartella a partire da Immagini e poi scendere)
/home/Gigi/Documents/miofile.doc Un path assoluto in Linux (la root è indicata dalla prima barra)

Notiamo che i path assoluti sono molto più lunghi da scrivere, ed inoltre richiedono di indicare esattamente tutto il percorso dalla root al file: indicare un path assoluto è pericoloso perchè in un altro computer i nomi di queste cartelle potrebbero cambiare (tipicamente quella con il nome dell'utente) e quindi il programma non sarebbe portabile da un computer all'altro.

Per questo è molto meglio usare i path relativi. In genere in un'applicazione piuttosto complessa, che necessita di risorse grafiche e sonore, i programmatori tendono a separare i diversi tipi di file (programmi, grafica, suono ed altre risorse) memorizzandoli in cartelle diverse. La nostra strategia sarà questa:

Se nella nostra cartella base Space_Invaders abbiamo creato la sottocartella Graphics, potremo caricare il file grafico ship.gif con l'istruzione pygame.image.load("Graphics\ship.gif") (in Windows): il path relativo è molto semplice e contiene solo il nome della sottocartella e quello del file. Ricordo ancora che chi è abituato a Windows tende ad ignorare la differenza tra maiuscole e minuscole nei nomi dei file, ma dobbiamo abituarci a tenerne conto altrimenti Python darà un errore file not found nei sistemi Linux.

La FUNZIONE join()

Rimane ancora il problema di come indicare il cammino nei vari sistemi operativi, che usano separatori diversi tra una cartella ed un'altra. A questo, però, pensa direttamente Python, che, conformemente alla sua filosofia di rendere il più possibile le cose facili ed indipendenti dal sistema operativo, ha un modulo standard os nel quale è contenuta una serie di funzioni che si incaricano di "dialogare" con i vari sistemi operativi, facendosi carico della gestione delle differenze tra l'uno e l'altro

La funzione che ci interessa è la os.path.join(), che prende come parametri un numero variabile di string e restituisce un'altra string contenente un path conforme alle regole vigenti nel sistema sul quale il programma sta girando. Così possiamo sostituire l'istruzione vista sopra con questa, che è indipendente dal sistema operativo:


from os.path import join     # importiamo la sola funzione che ci interessa

    . . . 
img_ship = pygame.image.load(join("Graphics", "ship.gif"))
   . . .

In questo modo Python caricherà il file "ship.gif" nella cartella "Graphics", ricostruendo da solo il path in base al sistema operativo in cui sta girando il programma. La documentazione ufficiale di pygame raccomanda l'uso della join, in modo da rendere il vostro programma compatibile con tutti i sistemi operativi.