Skip to content

Ottenere il nome del file, la directory e l’estensione da una stringa di percorso in Python

Python

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