Skip to content

Ottenere i timestamp dei file (data e ora di creazione, modifica e accesso) in Python

Python

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.