
In Python, puoi usare la libreria standard os ei moduli pathlib per ottenere timestamp come la creazione, la modifica e la data e l’ora di accesso dei file. Può essere ottenuto nell’ora Unix (Epoch time, Posix time) ma può essere convertito in data e ora utilizzando il modulo datetime.
È possibile ottenere i seguenti timestamp. Il significato varia a seconda del sistema operativo, quindi presta particolare attenzione al tempo di creazione.
- tempo: ora di accesso
- mtime: tempo di modifica
- ctime: tempo di modifica (Unix) e ora di creazione (Windows)
- ora di nascita: ora di creazione (alcuni Unix nella famiglia FreeBSD, incluso macOS)
In questo articolo vengono descritti i seguenti contenuti.
- Ottieni os.stat_result con informazioni sul timestamp
- Percorso.stat()
- os.stat()
- Attributi di os.stat_result
- Ottieni timestamp con la funzione os.path
- Converti timestamp in datetime
- Tipo di timestamp: atime, ctime, mtime, ora di nascita
- Ottieni i dati e l’ora di modifica
- Ottieni i dati e l’ora di creazione
Ad esempio, crea un file e aggiornalo dopo 10 secondi.
import os
import pathlib
import datetime
import time
import platform
p = pathlib.Path('data/temp/test.txt')
p.write_text('test')
time.sleep(10)
p.write_text('update')
Ottieni os.stat_result con informazioni sul timestamp
È possibile ottenere metadati di file, come timestamp, come attributi dell’oggetto os.stat_result.
Percorso.stat()
È possibile ottenere l’oggetto os.stat_result con il metodo stat() dell’oggetto pathlib.Path.
print(p.stat())
# os.stat_result(st_mode=33188, st_ino=8728494137, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=6, st_atime=1549094615, st_mtime=1549094615, st_ctime=1549094615)
print(type(p.stat()))
# <class 'os.stat_result'>
os.stat()
Puoi anche usare la funzione os.stat() del modulo os per ottenere l’oggetto os.stat_result. L’argomento può essere una stringa di percorso o un oggetto pathlib.Path (Python 3.6 o successivo).
print(os.stat('data/temp/test.txt'))
# os.stat_result(st_mode=33188, st_ino=8728494137, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=6, st_atime=1549094615, st_mtime=1549094615, st_ctime=1549094615)
print(type(os.stat('data/temp/test.txt')))
# <class 'os.stat_result'>
print(os.stat(p))
# os.stat_result(st_mode=33188, st_ino=8728494137, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=6, st_atime=1549094615, st_mtime=1549094615, st_ctime=1549094615)
print(type(os.stat(p)))
# <class 'os.stat_result'>
Tutti i metodi ti danno lo stesso oggetto os.stat_result.
print(p.stat() == os.stat('data/temp/test.txt') == os.stat(p))
# True
Attributi di os.stat_result
È possibile ottenere timestamp con gli attributi st_atime, st_mtime e st_ctime dell’oggetto os.stat_result. Su alcuni sistemi Unix della famiglia FreeBSD, incluso macOS, c’è anche un attributo st_birthtime. Il significato di ciascuno è descritto più avanti.
st = p.stat()
print(st.st_atime)
# 1549094615.972488
print(st.st_mtime)
# 1549094615.9723485
print(st.st_ctime)
# 1549094615.9723485
print(st.st_birthtime)
# 1549094605.9650702
Tutti gli attributi sono numeri a virgola mobile e rappresentano l’ora Unix (Epoch time, Posix time). Come chiedere questo valore in datetime è descritto più avanti.
print(type(st.st_ctime))
# <class 'float'>
Ci sono anche st_atime_ns, st_ctime_ns e st_mtime_ns che memorizzano il valore di un intero int in nanosecondi. Non esiste un attributo equivalente per st_birthtime.
print(st.st_ctime_ns)
# 1549094615972348510
print(type(st.st_ctime_ns))
# <class 'int'>
Si noti che, come mostrato nella documentazione, il numero in virgola mobile float contiene informazioni dopo la virgola decimale e xxx_ns memorizza i valori in nanosecondi, ma l’accuratezza non è garantita.
Il significato esatto e la risoluzione degli attributi st_time, st_mtime e st_ctime funzioni dal sistema operativo e dal file system. Ad esempio, sui sistemi Windows che utilizzano i file system FAT o FAT32, st_mtime ha una risoluzione di 2 secondi e st_atime ha solo una risoluzione di 1 giorno. Consulta la documentazione del tuo sistema operativo per i dettagli.
os — Interfacce varie del sistema operativo — Documentazione Python 3.10.0
os.stat_result ha vari altri attributi, come st_size, che indica la dimensione del file in byte. Vedere il seguente articolo su come ottenere le dimensioni di file e cartelle.
Ottieni timestamp con la funzione os.path
Puoi anche ottenere timestamp con la funzione os.path, getatime(), getmtime() e getctime().
print(os.path.getatime('data/temp/test.txt'))
# 1549094615.972488
print(os.path.getmtime('data/temp/test.txt'))
# 1549094615.9723485
print(os.path.getctime('data/temp/test.txt'))
# 1549094615.9723485
In Python 3.6 o versioni successive, puoi anche specificare l’oggetto pathlib.Path come argomento anziché come stringa di percorso.
print(os.path.getctime(p))
# 1549094615.9723485
Come puoi vedere nel codice sorgente, queste funzioni devono solo gli attributi corrispondenti di os.stat_result.
def getmtime(filename):
"""Return the last modification time of a file, reported by os.stat()."""
return os.stat(filename).st_mtime
def getatime(filename):
"""Return the last access time of a file, reported by os.stat()."""
return os.stat(filename).st_atime
def getctime(filename):
"""Return the metadata change time of a file, reported by os.stat()."""
return os.stat(filename).st_ctime
Ovviamente, puoi ottenere esattamente lo stesso valore di ottenere os.stat_result con Path.stat() o os.stat() e specificarne l’attributo.
print(os.path.getctime(p) == p.stat().st_ctime)
# True
Le funzioni per ottenere st_atime_ns, st_ctime_ns, st_mtime_ns e st_birthtime non sono fornite.
Converti timestamp in datetime
Come nel codice di esempio precedente, il timestamp è espresso in Unix time (Epoch time, Posix time).
Per convertirlo in un oggetto datetime, utilizzare la funzione datetime.fromtimestamp() del modulo datetime.
dt = datetime.datetime.fromtimestamp(p.stat().st_ctime)
print(dt)
# 2019-02-02 17:03:35.972348
print(type(dt))
# <class 'datetime.datetime'>
Per ulteriori informazioni, incluso come specificare il fuso orario durante la conversione, vedere l’articolo seguente.
L’oggetto datetime può essere convertito in una stringa in qualsiasi formato o formato ISO.
print(dt.strftime('%Y年%m月%d日 %H:%M:%S'))
# 2019年02月02日 17:03:35
print(dt.isoformat())
# 2019-02-02T17:03:35.972348
Tipo di timestamp: atime, ctime, mtime, ora di nascita
Come accennato nell’introduzione, esistono diversi tipi di timestamp: atime, ctime, mtime e birthtime.
- tempo: ora di accesso
- mtime: tempo di modifica
- ctime: tempo di modifica (Unix) e ora di creazione (Windows)
- ora di nascita: ora di creazione (alcuni Unix nella famiglia FreeBSD, incluso macOS)
Vedere la pagina seguente per i dettagli.
Ottieni i dati e l’ora di modifica
Per il cosiddetto tempo di modifica, puoi ottenere mtime in dal sistema operativo.
Utilizzare l’attributo st_mtime di os.stat_result o la funzione os.path.getmtime() come nel codice di esempio finora.
print(os.path.getmtime('data/temp/test.txt'))
# 1549094615.9723485
print(p.stat().st_mtime)
# 1549094615.9723485
Per convertirlo in un oggetto datetime, utilizzare la funzione datetime.fromtimestamp() del modulo datetime.
print(datetime.datetime.fromtimestamp(p.stat().st_mtime))
# 2019-02-02 17:03:35.972348
Su Unix, puoi usare ctime per ottenere l’ultima ora modificata dei metadati, quindi se vuoi acquisire le modifiche ai nomi dei file, esempio, usa ctime invece di mtime. Nota che su Windows, ctime è l’ora di creazione.
Ottieni i dati e l’ora di creazione
Come accennato in precedenza, il metodo per ottenere l’ora di creazione varia a seconda del sistema operativo.
- Finestre: ora
- Alcuni Unix come macOS: la nascita
- Altro Unix: non è possibile recuperare l’ora di creazione
Approccio multipiattaforma
Se il tuo programma è solo per Windows o macOS, puoi usare st_ctime o st_birthtime, ma se vuoi supportare più piattaforme, ma vuoi definire una funzione.
Citare il codice di esempio elencato nella seguente risposta alla domanda e sullo Stack Overflow.
def creation_date(path_to_file):
"""
Try to get the date that a file was created, falling back to when it was
last modified if that isn't possible.
See http://stackoverflow.com/a/39501288/1709587 for explanation.
"""
if platform.system() == 'Windows':
return os.path.getctime(path_to_file)
else:
stat = os.stat(path_to_file)
try:
return stat.st_birthtime
except AttributeError:
# We're probably on Linux. No easy way to get creation dates here,
# so we'll settle for when its content was last modified.
return stat.st_mtime
Innanzitutto, controlla se il sistema è Windows o meno con platform.system(), quindi utilizza la gestione delle eccezioni per cambiare l’operazione a seconda che l’attributo st_birthtime esiste o meno.
Vedere l’articolo seguente per ulteriori informazioni su platform.system() e sulla gestione delle eccezioni.
L’argomento può essere una stringa di percorso o un oggetto pathlib.Path (Python 3.6 o successivo).
print(creation_date(p))
# 1549094605.9650702
print(datetime.datetime.fromtimestamp(creation_date(p)))
# 2019-02-02 17:03:25.965070
Si noti che la funzione in questo codice di esempio include st_mtime, che indica l’ora di modifica, se st_birthtime non esiste. In alcuni casi, potrebbe essere meglio recuperare Nessuno per indicare chiaramente che l’ora di creazione non può essere recuperata.