You are here: Partenza > Dive Into Python > Una struttura orientata agli oggetti > Il modulo os | << >> | ||||
Dive Into PythonPython per programmatori esperti |
Il modulo os ha molte funzioni utili per manipolare file e processi e os.path ha molte funzioni per manipolare percorsi di file e directory.
>>> import os >>> os.path.join("c:\\music\\ap\\", "mahadeva.mp3") 'c:\\music\\ap\\mahadeva.mp3' >>> os.path.join("c:\\music\\ap", "mahadeva.mp3") 'c:\\music\\ap\\mahadeva.mp3' >>> os.path.expanduser("~") 'c:\\Documents and Settings\\mpilgrim\\My Documents' >>> os.path.join(os.path.expanduser("~"), "Python") 'c:\\Documents and Settings\\mpilgrim\\My Documents\\Python'
os.path è un riferimento ad un modulo che dipende dalla piattaforma sulla quale lavorate. Proprio come getpass considera le differenze fra le piattaforme, impostando getpass ad una funzione specifica, anche os ne tiene conto impostando path come un modulo specifico per piattaforma in uso. | |
La funzione join di os.path costruisce un pathname a partire da uno o più pathname parziali. In questo semplice caso, si limita a concatenare delle stringhe. (Notate che occuparsi di pathname su Windows è odioso a causa del fatto che il carattere backslash deve essere escapato.) | |
Il questo esempio un po' banale, join aggiungerà un backslash extra al pathname prima di unirlo al nome del file. Ero contentissimo quando lo scoprii, dato che addSlashIfNecessary è una delle piccole e stupide funzioni che devo sempre scrivere, quando costruisco la mia toolbox in un nuovo linguaggio. Non scrivete queste piccole e stupide funzioni in Python; qualcun altro se ne è già occupato per voi. | |
expanduser espanderà un pathname che usa ~ per rappresentare la home directory dell'utente attuale. Questo funziona su ogni piattaforma ove gli utenti hanno una home directory, come Windows, UNIX e Mac OS X, non ha effetto su Mac OS. | |
Combinando queste tecniche, potete facilmente costruire percorsi per directory e file sotto la home directory dell'utente. |
>>> os.path.split("c:\\music\\ap\\mahadeva.mp3") ('c:\\music\\ap', 'mahadeva.mp3') >>> (filepath, filename) = os.path.split("c:\\music\\ap\\mahadeva.mp3") >>> filepath 'c:\\music\\ap' >>> filename 'mahadeva.mp3' >>> (shortname, extension) = os.path.splitext(filename) >>> shortname 'mahadeva' >>> extension '.mp3'
La funzione split divide un pathname completo e ritorna una tupla contenente il percorso ed il nome del file. Ricordate quando dissi che potevate usare assegnamenti multi-variabile per ritornare valori multipli da una funzione? Bene, split è una di queste funzioni. | |
Assegnamo il valore di ritorno della funzione split ad una tupla di due variabili. Ogni variabile riceve il valore dell'elemento corrispondente dalla tupla ritornata. | |
La prima variabile, filepath, riceve il valore del primo elemento della tupla ritornata da split, il percorso del file. | |
La seconda variabile, filename, riceve il valore del secondo elemento della tupla ritornata da split, il nome del file. | |
os.path contiene anche una funzione splitext, che divide il nome di un file e ritorna una tupla contenente il nome del file e la sua estensione. Usiamo la stessa tecnica per assegnare ognuno di questi a variabili separate. |
>>> os.listdir("c:\\music\\_singles\\") ['a_time_long_forgotten_con.mp3', 'hellraiser.mp3', 'kairo.mp3', 'long_way_home1.mp3', 'sidewinder.mp3', 'spinning.mp3'] >>> dirname = "c:\\" >>> os.listdir(dirname) ['AUTOEXEC.BAT', 'boot.ini', 'CONFIG.SYS', 'cygwin', 'docbook', 'Documents and Settings', 'Incoming', 'Inetpub', 'IO.SYS', 'MSDOS.SYS', 'Music', 'NTDETECT.COM', 'ntldr', 'pagefile.sys', 'Program Files', 'Python20', 'RECYCLER', 'System Volume Information', 'TEMP', 'WINNT'] >>> [f for f in os.listdir(dirname) if os.path.isfile(os.path.join(dirname, f))] ['AUTOEXEC.BAT', 'boot.ini', 'CONFIG.SYS', 'IO.SYS', 'MSDOS.SYS', 'NTDETECT.COM', 'ntldr', 'pagefile.sys'] >>> [f for f in os.listdir(dirname) if os.path.isdir(os.path.join(dirname, f))] ['cygwin', 'docbook', 'Documents and Settings', 'Incoming', 'Inetpub', 'Music', 'Program Files', 'Python20', 'RECYCLER', 'System Volume Information', 'TEMP', 'WINNT']
La funzione listdir prende un pathname e ritorna una lista del contenuto della directory. | |
listdir ritorna sia file che directory, senza indicare quale sia. | |
Potete usare il list filtering e la funzione isfile del modulo os.path per separare i file dalle directory. isfile prende un pathname e ritorna 1, nel caso in cui il percorso rappresenti un file e 0 altrimenti. Qui stiamo usando os.path.join per assicurarci un pathname completo, ma isfile funziona anche con un percorso parziale, relativo alla directory corrente. Potete usare os.getcwd() per ottenere la directory corrente. | |
os.path ha anche una funzione isdir che ritorna 1 se il percorso rappresenta una directory e 0 altrimenti. Potete usarla per ottenere la lista delle sottodirectory di un percorso. |
def listDirectory(directory, fileExtList): "get list of file info objects for files of particular extensions" fileList = [os.path.normcase(f) for f in os.listdir(directory)] fileList = [os.path.join(directory, f) for f in fileList \ if os.path.splitext(f)[1] in fileExtList]
Queste due linee di codice fanno tutto ciò che abbiamo imparato finora sul modulo os e anche qualcos'altro.
Ogniqualvolta sia possibile, dovreste usare le funzioni in os e os.path per file, directory e manipolazione dei percorsi. Questi moduli sono dei wrapper ai moduli specifici per piattaforma, per cui funzioni come os.path.split funzionano su UNIX, Windows, Mac OS ed ogni altra possibile piattaforma supportata da Python. |
<< Ancora sui moduli |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | |
Mettere tutto insieme >> |