
In Python, puoi ottenere il nome del file (nome di base), il nome della directory (cartella) e l’estensione da una stringa di percorso o unire le stringhe per generare la stringa di percorso con il modulo os.path nella libreria standard .
In questo articolo vengono descritti i seguenti contenuti.
- Differenza nel separatore di percorso in base al sistema operativo
- Ottieni il nome del file (nome di base) da un percorso:
os.path.basename()
- Nome file con estensione
- Nome file senza estensione
- Ottieni il nome della directory (cartella) da un percorso:
os.path.dirname()
- Ottieni la coppia di nomi di file e directory:
os.path.split()
- Nota su quando una stringa di percorso indica una directory
- Ottieni l’estensione:
os.path.splitext()
- Crea una stringa di percorso con un’estensione diversa
- Ottieni l’estensione senza punto (punto)
- Esempi di casi come .tar.gz
- Crea una stringa di percorso combinando i nomi di file e directory:
os.path.join()
- Crea una stringa di percorso per un altro file nella stessa directory
- Usa diversi formati di sistema operativo
- Esempi per Windows
- Barra rovesciata e stringa greggia
- Esempi per ottenere il nome del file, il nome della cartella, l’estensione
- Ottieni e unisciti a una lettera di unità:
os.path.splitdrive()
Usa la seguente stringa di percorso come esempio.
import os
filepath = './dir/subdir/filename.ext'
Il codice di esempio riportato di seguito è in esecuzione su un Mac. Alla fine sono mostrati esempi per Windows.
In Python 3.4 o versioni successive, puoi anche ottenere il nome del file, il nome della directory (cartella), l’estensione, ecc., con il modulo pathlib che tratta i percorsi come oggetti.
Differenza nel separatore di percorso in base al sistema operativo
Il separatore di percorso dipende dal sistema operativo. UNIX (incluso Mac) usa la barra / e Windows usa la barra rovesciata come separatore.
Puoi ottenere il separatore nel sistema operativo che esegue Python con os.sep o os.path.sep.
print(os.sep)
# /
print(os.sep is os.path.sep)
# True
Ottieni il nome del file (nome di base) da un percorso:os.path.basename()
Utilizzare os.path.basename() per ottenere il nome del file (nome base) da una stringa di percorso.
Nome file con estensione
os.path.basename() fornisce il nome del file con l’estensione.
filepath = './dir/subdir/filename.ext'
basename = os.path.basename(filepath)
print(basename)
# filename.ext
print(type(basename))
# <class 'str'>
Nome file senza estensione
Puoi ottenere il nome del file senza l’estensione con os.path.splitext() più avanti avanti.
basename_without_ext = os.path.splitext(os.path.basename(filepath))[0]
print(basename_without_ext)
# filename
os.path.splitext() divide all’ultimo punto (a destra) .. Se vuoi dividere per il primo punto (a sinistra), usa split().
filepath_tar_gz = './dir/subdir/filename.tar.gz'
print(os.path.splitext(os.path.basename(filepath_tar_gz))[0])
# filename.tar
print(os.path.basename(filepath_tar_gz).split('.', 1)[0])
# filename
Ottieni il nome della directory (cartella) da un percorso:os.path.dirname()
Utilizzare os.path.dirname() per ottenere la cartella della directory (nome) da una stringa di percorso.
filepath = './dir/subdir/filename.ext'
dirname = os.path.dirname(filepath)
print(dirname)
# ./dir/subdir
print(type(dirname))
# <class 'str'>
Se vuoi ottenere solo il nome della directory direttamente sopra il file, usa os.path.basename().
subdirname = os.path.basename(os.path.dirname(filepath))
print(subdirname)
# subdir
Ottieni la coppia di nomi di file e directory:os.path.split()
Utilizzare os.path.split() per ottenere sia il nome del file che della directory (cartella).
os.path.split() fornisce una tupla di nome file restituito da os.path.basename() e nome directory restituito da os.path.dirname().
filepath = './dir/subdir/filename.ext'
base_dir_pair = os.path.split(filepath)
print(base_dir_pair)
# ('./dir/subdir', 'filename.ext')
print(type(base_dir_pair))
# <class 'tuple'>
print(os.path.split(filepath)[0] == os.path.dirname(filepath))
# True
print(os.path.split(filepath)[1] == os.path.basename(filepath))
# True
Puoi decomprimere la tupla da donare a ciascuna variabile.
dirname, basename = os.path.split(filepath)
print(dirname)
# ./dir/subdir
print(basename)
# filename.ext
Utilizzare os.path.join() descritto più avanti per unire nuovamente i nomi di file e directory.
Note su quando una stringa di percorso indica una directory
Si noti che se la stringa di percorso indica una directory (cartella), il risultato sarà diverso a seconda che sia presente un separatore alla fine.
Nessun separatore alla fine:
dirpath_without_sep = './dir/subdir'
print(os.path.split(dirpath_without_sep))
# ('./dir', 'subdir')
print(os.path.basename(dirpath_without_sep))
# subdir
Se è presente un separatore alla fine, utilizzare os.path.dirname() e os.path.basename() per ottenere il nome della cartella inferiore.
dirpath_with_sep = './dir/subdir/'
print(os.path.split(dirpath_with_sep))
# ('./dir/subdir', '')
print(os.path.basename(os.path.dirname(dirpath_with_sep)))
# subdir
Ottieni l’estensione:os.path.splitext()
Usa os.path.splitext() per ottenere l’estensione.
os.path.splitext() divide l’estensione e altre e la restituisce come una tupla. L’estensione contiene il punto ..
filepath = './dir/subdir/filename.ext'
root_ext_pair = os.path.splitext(filepath)
print(root_ext_pair)
# ('./dir/subdir/filename', '.ext')
print(type(root_ext_pair))
# <class 'tuple'>
La concatenazione con l’operatore + restituisce la stringa del percorso originale.
root, ext = os.path.splitext(filepath)
print(root)
# ./dir/subdir/filename
print(ext)
# .ext
path = root + ext
print(path)
# ./dir/subdir/filename.ext
Crea una stringa di percorso con un’estensione diversa
Per creare una stringa di percorso con solo l’estensione modificata dall’originale, concatenare il primo elemento della tu restituita da os.path.splitext() con qualsiasi estensione.
other_ext_filepath = os.path.splitext(filepath)[0] + '.jpg'
print(other_ext_filepath)
# ./dir/subdir/filename.jpg
Ottieni l’estensione senza punto (punto)
Se vuoi ottenere l’estensione senza il punto (punto)., specifica la seconda stringa e le successive con slice [1:].
ext_without_dot = os.path.splitext(filepath)[1][1:]
print(ext_without_dot)
# ext
Esempi di casi come .tar.gz
Come mostrato nell’esempio sopra, os.path.plitext() si divide all’ultimo punto (a destra) .. Fai attenzione con allarga come .tar.gz.
filepath_tar_gz = './dir/subdir/filename.tar.gz'
print(os.path.splitext(filepath_tar_gz))
# ('./dir/subdir/filename.tar', '.gz')
Se vuoi dividere per il primo punto (a sinistra). nel nome del file, usa il metodo split() della stringa, ma non funziona se il nome della directory contiene anche il punto..
print(filepath_tar_gz.split('.', 1))
# ['', '/dir/subdir/filename.tar.gz']
Dopo aver diviso os.path.split(), applica il metodo split() della stringa e unisciti con os.path.join() descritto più avanti.
La stringa restituita da split() non contiene un delimitatore, quindi fai attenzione se vuoi ottenere un’estensione con un punto . vieni os.path.splitext().
dirname, basename = os.path.split(filepath_tar_gz)
basename_without_ext, ext = basename.split('.', 1)
path_without_ext = os.path.join(dirname, basename_without_ext)
print(path_without_ext)
# ./dir/subdir/filename
print(ext)
# tar.gz
ext_with_dot = '.' + ext
print(ext_with_dot)
# .tar.gz
Crea una stringa di percorso combinando i nomi di file e directory:os.path.join()
Utilizzare os.path.join() per unire i nomi di file e directory per creare una nuova stringa di percorso.
path = os.path.join('dir', 'subdir', 'filename.ext')
print(path)
# dir/subdir/filename.ext
Crea una stringa di percorso per un altro file nella stessa directory
Se vuoi creare una stringa di percorso per un altro file nella stessa directory di un file, usa os.path.dirname() e os.path.join().
filepath = './dir/subdir/filename.ext'
other_filepath = os.path.join(os.path.dirname(filepath), 'other_file.ext')
print(other_filepath)
# ./dir/subdir/other_file.ext
Usa diversi formati di sistema operativo
Se vuoi manipolare le stringhe di percorso in un formato del sistema operativo che non è il sistema operativo su cui è attualmente in esecuzione Python, importa e usa moduli diversi invece del modulo os.
- UNIX (incluso il Mac attuale):
posixpath
- Finestre:
ntpath
- Macintosh 9 e precedenti:
macpath
Poiché ogni modulo ha la stessa interfaccia di os.path, è possibile modificare la parte os.path del codice di esempio finora con i nomi dei moduli (come ntpath).
Esempi per Windows
Il codice di esempio seguente è in esecuzione su Mac utilizzando il modulo ntpath menzionato sopra. Quando si esegue su Windows, è possibile sostituire ntpath con os.path.
Barra rovesciata e stringa greggia
Il separatore di percorso in Windows è la barra rovesciata.
Per scrivere una barra inversa in una stringa, devi scrivere due barre inverse per l’escape. print() fa una barra rovesciata.
import ntpath
print(ntpath.sep)
#
print('\')
#
print(ntpath.sep is '\')
# True
La stringa grezza (r’xxx’) semplifica la scrittura di un percorso di Windows perché puoi scrivere una barra rovesciata così com’è. Una stringa grezza e una stringa normale hanno lo stesso valore.
file_path = 'c:\dir\subdir\filename.ext'
file_path_raw = r'c:dirsubdirfilename.ext'
print(file_path == file_path_raw)
# True
Per ulteriori informazioni sulle stringhe non elaborate, vedere l’articolo seguente.
Esempi per ottenere il nome del file, il nome della cartella, l’estensione
Funziona anche su Windows.
print(ntpath.basename(file_path))
# filename.ext
print(ntpath.dirname(file_path))
# c:dirsubdir
print(ntpath.split(file_path))
# ('c:\dir\subdir', 'filename.ext')
Ottieni e unisciti a una lettera di unità:os.path.splitdrive()
Utilizzare os.path.splitdrive() per ottenere la lettera di unità. Il codice di esempio riportato di seguito utilizza ntpath.splitdrive().
os.path.splitdrive() divide la lettera di unità inclusi i due punti: e altri.
print(ntpath.splitdrive(file_path))
# ('c:', '\dir\subdir\filename.ext')
Se vuoi ottenere solo la lettera di unità, seleziona il primo carattere.
drive_letter = ntpath.splitdrive(file_path)[0][0]
print(drive_letter)
# c
Fai attenzione quando unisci i personaggi di unità.
Se lo passi a os.path.join() così com’è, non funzionerà.
print(ntpath.join('c:', 'dir', 'subdir', 'filename.ext'))
# c:dirsubdirfilename.ext
Puoi anche specificare l’argomento os.sep (ntpath.sep nel codice di esempio) nell’argomento di os.path.join() o aggiungere un separatore alla lettera di unità.
print(ntpath.join('c:', ntpath.sep, 'dir', 'subdir', 'filename.ext'))
# c:dirsubdirfilename.ext
print(ntpath.join('c:\', 'dir', 'subdir', 'filename.ext'))
# c:dirsubdirfilename.ext