Home > PyQt5, python > PyQt5: QDir

PyQt5: QDir

27 Maggio 2019

Torna all’indice degli appunti

QDir

La classe QDir permette di accedere ad una directory e al proprio contenuto.
L’oggetto QDir è usato per manipolare i nomi dei path, accedere ai path ed ai files, modificare il file system.
Il separatore di directory utilizzato da Qt è “/”.
Inoltre è possibile fare riferimento ad un file, sia con percorsi relativi, che assoluti.

Il costruttore è ovviamente QDir:

Se in fase di costruzione, non passiamo nessun path, verrà assunto come percorso, quello corrente, altrimenti si passa il path desiderato, al costruttore.
La struttura di directory e file che usiamo come riferimento, è molto semplice:

C:
|
|-temp
    |
    |-test.txt
    |-test.png
    |--example 
         |
         |-first.txt
         |-second.txt
         |-test.py
>>> from PyQt5.QtCore import QDir
>>> dir = QDir("C:/temp")

PATHS

Per sapere se il path passato al costruttore, esiste, si utilizza il metodo exists:

>>> dir.exists()
True

Per sapere se il path è relativo o assoluto, si utilizzano i metodi isRelative e isAbsolute:

>>> dir.isAbsolute()
True

Il path dell’oggetto QDir, si ottiene con il metodo path:

>>> dir.path()
'C:/temp'

Il percorso può essere modificato con i metodi cd(path) e cdUp() con il quale si risale di livello dalla directory corrente:

>>> dir.cd("example")
True
>>> dir.path()
'C:/temp/example'
>>> dir.cdUp()
True
>>> dir.path()
'C:/temp'

Come si nota, il metodo cd(path), restituisce anche un boolean indicante il buon esito del comando cd.
Qualora si tentasse di spostarsi in una directory inesistente, verrà ritornato False.

>>> dir.cd("notpresent")
False
>>> dir.path()
'C:/temp'

Per settare una nuova path nell’oggetto QDir, si utilizza il metodo setPath(path):

>>> dir.setPath("F:/bancaldo")
>>> dir.path()
'F:/bancaldo'

DIRECTORIES

Il nome della directory si ottiene con il metodo dirName

>>> dir.dirName()
'temp'

Una directory contiene le cosiddette entries, ovvero ulteriori directories, files e link simbolici.
Con il metodo count, si ottiene il numero di entries presenti nel path dell’oggetto QDir, mentre con il metodo entryList si ottiene una lista di stringhe, rappresentanti le entries.

>>> dir.count()
5
>>> dir.entryList()
['.', '..', 'example', 'test.png', 'test.txt']

Infine con entryInfoList si ottiene una lista di oggetti QFileInfo, ognuno dei quali contiene tutte
le informazioni di ogni entry:

>>> qf = dir.entryInfoList()[-1]
>>> qf.fileName()
'test.txt'
>>> qf.size()
0

creare una directory

Ovviamente le directory possono essere create, rimosse, rinominate.
Questo è possibile con i corrispondenti metodi mkdir(newdir), rmdir(dir_to_remove) e rename(oldname, newname).
Vediamo il caso di creazione di una nuova directory:

>>> dir.mkdir("new_dir")
True

Se la creazione non va a buon fine o la directory è già esistente, il metodo ritornerà False.
Una volta effettuata la modifica, bisogna chiamare il metodo refresh, che aggiorna le informazioni della directory rappresentata dal path.

>>> dir.mkdir("new_dir")
>>> dir.entryList()
['.', '..', 'example', 'test.png', 'test.txt']
>>> dir.refresh()
>>> dir.entryList()
['.', '..', 'example', 'new_dir', 'test.png', 'test.txt']

Rinominare una directory

Il metodo per rinominare una directory è rename(oldnamem, newname), dove oldname è la directory che vogliamo rinominare, mentre newname è appunto il nuovo nome da assegnare alla directory stessa.
Se l’operazione andrà a buon fine, riceveremo il valore True, altrimenti False:

>>> dir.rename("new_dir", "new_dir_2")
True
>>> dir.refresh()
>>> dir.entryList()
['.', '..', 'example', 'new_dir_2', 'test.png', 'test.txt']

Eliminare una directory

Il metodo è rmdir(dir_to_remove):

>>> dir.rmdir('new_dir_2')
True
>>> dir.refresh()
>>> dir.entryList()
['.', '..', 'example', 'test.png', 'test.txt']

FILES

Per verificare la presenza di un file all’interno del nostro path, si utilizza ancora exists(filename), passando come argomento il nome del file che stiamo cercando:

>>> dir.setPath("C:/temp")
>>> dir.exists("test.txt")
True
>>> dir.exists("test3.txt")
False

SPECIAL PATHS

Sono metodi che restituiscono oggetti QDir e le rispettive stringhe dei percorsi corrispondenti, di paths speciali, come la directory di lavoro dell’applicazione, la user directory, ecc.
Sono principalmente 4 coppie:

current() e currentPath(): Restituiscono rispettivamente l’oggetto QDir e il path della directory di lavoro dell’applicazione;

>>> QDir.current().currentPath()
'F:/bancaldo/python/Qt5'

home() e homePath(): Restituiscono rispettivamente l’oggetto QDir e il path della home directory dell’utente;

>>> QDir.home().homePath()
'C:/Users/bancaldo'

root() e root(): Restituiscono rispettivamente l’oggetto QDir e il path della root directory;

>>> QDir.root().rootPath()
'C:/'

temp() e tempPath(): Restituiscono rispettivamente l’oggetto QDir e il path della temp directory del sistema operativo;

>>> QDir.temp().tempPath()
'C:/Users/bancaldo/AppData/Local/Temp'

FILTER

I due metodi precedentemente visti entryList() e entryInfoList(), permettono di utilizzare dei filtri, per ottimizzare la ricerca effettuata.
Tali filtri, sono enum e possono essere combinati tramite operazione bitwise OR. Possono assumere i seguenti valori:

Dirs | Files | Drives

Elenca i file per i quali l’app ha accesso in scrittura; il valore Writable deve essere combinato con Dirs o Files

Costante Valore Descrizione
QDir.Dirs 0x001 Elenca le directories che corrispondono ai filtri sul nome
QDir.AllDirs 0x400 Elenca tutte le directories; non vengono applicati filtri al nome
QDir.Files 0x002 Elenca i files
QDir.Drives 0x004 Elenca i dischi
QDir.NoSymLinks 0x008 Non elenca i symbolic links
QDir.NoDotAndDotDot NoDot | NoDotDot Non elenca le special entries “.” e “..”
QDir.NoDot 0x2000 Non elenca la special entry “.”
QDir.NoDotDot 0x4000 Non elenca la special entry “..”
QDir.AllEntries

Elenca directories, files, drives e symlinks
QDir.Readable 0x010

Elenca i file per i quali l’app ha accesso in lettura; il valore Readable deve essere combinato con Dirs o Files
QDir.Writable 0x020

QDir.Executable 0x040 Elenca i file per i quali l’app ha accesso in esecuzione; il valore Executable deve essere combinato con Dirs o Files
QDir.Modified 0x080 Elenca solo i file che sono stati modificati
QDir.Hidden 0x100 Elenca i file nascosti (su Unix i file che cominciano con “.”)
QDir.System 0x200 Elenca i file di sistema
QDir.CaseSensitive 0x800 Il filtro è case sensitive

Per ottenere i filtri attivi su un oggetto QDir, si utilizza il metodo filter() mentre per aggiungerne uno, a quelli esistenti, si utilizza il metodo setFilter(filter).
Di default, un oggetto QDir utilizza come enum filter, QDir.AllEntries, cioè mostra mostra tutte le directory, tutti i files e tutti i drives.
Come da tabella, QDir.AllEntries equivale a:

QDir.Dirs | QDir.Files | QDir.Drives

QDir.AllEntries = 7 (1 + 2 + 4)

>>> dir.filter().__int__()
7

Se volessi ad esempio elencare solo i files, dovrei passare il filtro QDir.Files (valore 2) all’oggetto QDir:

>>> dir.entryList()
['.', '..', 'example', 'test.png', 'test.txt']
>>> dir.setFilter(QDir.Files)
>>> dir.setFilter(QDir.Files)
>>> dir.filter().__int__()
2
>>> dir.entryList()
['test.png', 'test.txt']

NAME FILTER

E’ possibile anche filtrare sui nomi, grazie al metodo setNameFilters(filters), dove filters è una lista di stringhe che contengono i caratteri “*” e “?”, a seconda dell’occorrenza:

>>> dir.setNameFilters(["*.txt"])
>>> dir.entryList()
['test.txt']
>>> dir.setNameFilters(["t??t.*"])
>>> dir.entryList()
['test.png', 'test.txt']

SORTING

E’ possibile definire l’ordinamento della lista delle entries, passando al metodo setSorting(sort_union), l’OR dei seguenti valori:

QDir.Name 0x00 Sort by name.

Costante Valore Descrizione
QDir.Name 0x00 Ordinamento per Nome
QDir.Time 0x01 Ordinamento in base all’orario di modifica (modification time)
QDir.Size 0x02 Ordinamento per dimensione del file
QDir.Type 0x80 Ordinamento per estensione file
QDir.Unsorted 0x03 Nessun ordinamento
QDir.NoSort -1 Nessun ordinamento (default)
QDir.DirsFirst 0x04 Ordina con prima le directories e poi i files
QDir.DirsLast 0x20 Ordina con prima i files e poi le directories
QDir.Reversed 0x08 Inverte l’ordine
QDir.IgnoreCase 0x10 Ordina in modalità case-insensitive
QDir.LocaleAware 0x40 Ordina gli elementi usando i settings “locale”

Per ottenere i valori di sorting dell’oggetto QDir, si può utilizzare il metodo sorting().
Di default, l’ordinamento di un oggetto QDir equivale all’OR degli enum Qdir.IgnoreCase e Qdir.Name, cioè un valore di 16:

>>> dir2.sorting().__int__()
16

Mettiamo di voler ordinare per nome, ma tenere le dirs in fondo; dobbiamo fare l’OR di:

QDir.DirsLast | QDir.Name

che hanno come valori rispettivamente, 32 e 0:

>>> dir.entryList()
['.', '..', 'first.txt', 'second.txt', 'test.py']
>>> dir.setSorting(QDir.DirsLast | QDir.Name)
>>> dir.sorting().__int__()
32
>>> dir.entryList()
['first.txt', 'second.txt', 'test.py', '.', '..']

Torna all’indice degli appunti

Categorie:PyQt5, python Tag: ,
I commenti sono chiusi.