Фиксация и чтение времени создания файлов и объектов в Python
Основные подходы к определению времени создания
Наиболее эффективное решение для получения времени создания файла или объекта
Для файлов рекомендуется использовать комбинацию os.stat() с проверкой атрибута st_birthtime (время создания на BSD и некоторых файловых системах) и st_ctime (изменение метаданных на Unix или время создания на Windows). Это обеспечивает максимальную точность на разных платформах. Для объектов Python удобнее всего сохранять момент инициализации через datetime.now() в атрибуте экземпляра.
Пример универсальной функции для файла:
import os
import datetime
def get_creation_time(filepath):
stat = os.stat(filepath)
try:
ts = stat.st_birthtime # доступно на BSD, macOS
except AttributeError:
ts = stat.st_ctime # Windows или Unix (ctime)
return datetime.datetime.fromtimestamp(ts)
# Пример использования
print(get_creation_time('test.txt'))время создания python (время создания файла/объекта в python)
2025-03-15 10:30:45.123456
время сообщения python (время сообщения (метка времени) в python)
Возможные проблемы и их решение
- Отсутствие st_birthtime: на многих Linux-системах этот атрибут не определён. В таком случае используется st_ctime, который не является временем создания файла, а временем последнего изменения метаданных. Для точного времени создания на Linux требуется вызов системного вызова
statx(пример в расширенных). - Ошибки доступа:
os.stat()может выброситьPermissionErrorилиFileNotFoundError. Необходима обработка исключений. - Разница в часовых поясах:
fromtimestampвозвращает локальное время без информации о часовом поясе. Для работы с UTC используетсяdatetime.fromtimestamp(ts, tz=datetime.timezone.utc).
Как получить время создания файла с помощью os.path.getctime?
Функция os.path.getctime() возвращает timestamp последнего изменения метаданных (ctime). На Windows это время создания файла, на Unix – не всегда. Самый простой, но платформозависимый вариант.
import os
import datetime
ctime = os.path.getctime('file.txt')
dt = datetime.datetime.fromtimestamp(ctime)
print(dt)
дата и время в python (работа с датой и временем в python)
Проблема
На Linux getctime возвращает не время создания, а время последнего изменения атрибутов (например, прав доступа). Это может ввести в заблуждение.
Как извлечь время создания объекта при его инициализации?
Для фиксации момента создания экземпляра класса достаточно сохранить текущую метку времени в конструкторе.
import datetime
class Document:
def __init__(self, name):
self.name = name
self.creation_time = datetime.datetime.now()
doc = Document('report.txt')
print(doc.creation_time)модуль время python (модуль time в python)
2025-03-15 10:32:10.987654
Python определить время (определение времени в python)
Ошибка
Если требуется сохранять время с микросекундной точностью, необходимо учитывать, что datetime.datetime.now() зависит от системных часов и может давать одинаковые значения при быстром последовательном создании объектов. Для разрешения этой проблемы можно использовать time.time_ns() или генерировать уникальные идентификаторы.
Как получить время создания файла на Windows через win32file?
Библиотека pywin32 позволяет на Windows получить точное время создания, используя win32file.GetFileTime.
import win32file
import datetime
handle = win32file.CreateFile(
'test.txt',
win32file.GENERIC_READ,
win32file.FILE_SHARE_READ,
None,
win32file.OPEN_EXISTING,
0,
None
)
create_time, _, _ = win32file.GetFileTime(handle)
win32file.CloseHandle(handle)
dt = datetime.datetime.fromtimestamp(
(create_time - 116444736000000000) / 10000000
)
print(dt)Python время года (определение времени года по дате в python)
Зависимость от платформы
Код работает только на Windows и требует установки pywin32. Альтернатива – использовать os.stat, как в базовом решении.
Как определить время создания файла на Linux с помощью statx?
Системный вызов statx (доступен с ядра 4.11) позволяет получить btime – время создания. Используется через ctypes.
import ctypes
import os
import datetime
# Структура statx
class statx(ctypes.Structure):
_fields_ = [
('stx_mask', ctypes.c_uint32),
('stx_blksize', ctypes.c_uint32),
('stx_attributes', ctypes.c_uint64),
('stx_nlink', ctypes.c_uint32),
('stx_uid', ctypes.c_uint32),
('stx_gid', ctypes.c_uint32),
('stx_mode', ctypes.c_uint16),
('__pad0', ctypes.c_uint16),
('stx_ino', ctypes.c_uint64),
('stx_size', ctypes.c_uint64),
('stx_blocks', ctypes.c_uint64),
('stx_attributes_mask', ctypes.c_uint64),
('stx_atime', ctypes.c_int64),
('stx_atime_nsec', ctypes.c_int32),
('stx_mtime', ctypes.c_int64),
('stx_mtime_nsec', ctypes.c_int32),
('stx_ctime', ctypes.c_int64),
('stx_ctime_nsec', ctypes.c_int32),
('stx_btime', ctypes.c_int64),
('stx_btime_nsec', ctypes.c_int32),
]
libc = ctypes.CDLL('libc.so.6', use_errno=True)
sys_statx = libc.statx
sys_statx.argtypes = [ctypes.c_int, ctypes.c_char_p, ctypes.c_int, ctypes.c_uint, ctypes.POINTER(statx)]
sys_statx.restype = ctypes.c_int
buf = statx()
path = b'/home/user/file.txt'
AT_FDCWD = -100
flags = 0
mask = 0x00000800 # STATX_BTIME
ret = sys_statx(AT_FDCWD, path, flags, mask, ctypes.byref(buf))
if ret == 0:
ts = buf.stx_btime
dt = datetime.datetime.fromtimestamp(ts)
print(dt)
else:
errno = ctypes.get_errno()
raise OSError(errno, os.strerror(errno))Сложность и ограничения
Требуется современное ядро Linux и поддержка файловой системой. Для многих дистрибутивов проще использовать fallback на st_ctime.
Расширенные примеры работы с временем создания
Пакетная обработка файлов с записью результатов в CSV
import os
import datetime
import csv
def get_creation_time_fallback(path):
stat = os.stat(path)
try:
ts = stat.st_birthtime
except AttributeError:
ts = stat.st_ctime
return datetime.datetime.fromtimestamp(ts)
def batch_creation_times(directory, output_file):
with open(output_file, 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['filename', 'creation_time'])
for root, _, files in os.walk(directory):
for fname in files:
full = os.path.join(root, fname)
try:
dt = get_creation_time_fallback(full)
writer.writerow([full, dt.isoformat()])
except Exception as e:
writer.writerow([full, f'Error: {e}'])
batch_creation_times('/tmp/docs', 'creation_times.csv')Файл creation_times.csv будет содержать строки вида: /tmp/docs/a.txt,2025-03-15T10:30:00.123456 /tmp/docs/b.txt,2025-03-15T10:31:15.987654 ...
Асинхронное получение времени создания для нескольких файлов
import asyncio
import aiofiles
import os
import datetime
async def get_creation_time_async(filepath):
loop = asyncio.get_running_loop()
stat = await loop.run_in_executor(None, os.stat, filepath)
try:
ts = stat.st_birthtime
except AttributeError:
ts = stat.st_ctime
return filepath, datetime.datetime.fromtimestamp(ts)
async def main():
paths = ['/home/user/file1.txt', '/home/user/file2.txt']
tasks = [get_creation_time_async(p) for p in paths]
for coro in asyncio.as_completed(tasks):
path, dt = await coro
print(f'{path}: {dt}')
asyncio.run(main())/home/user/file1.txt: 2025-03-15 09:00:00.111111 /home/user/file2.txt: 2025-03-15 09:01:00.222222
Сравнение времени создания с текущим временем (возраст файла)
import os
import datetime
def file_age_in_seconds(filepath):
stat = os.stat(filepath)
try:
birth = stat.st_birthtime
except AttributeError:
birth = stat.st_ctime
now = datetime.datetime.now().timestamp()
return int(now - birth)
print(f"Файл создан {file_age_in_seconds('test.txt')} секунд назад")Файл создан 3600 секунд назад
Использование pathlib для более современного подхода
from pathlib import Path
import datetime
p = Path('my_file.txt')
stat = p.stat()
try:
ts = stat.st_birthtime
except AttributeError:
ts = stat.st_ctime
dt = datetime.datetime.fromtimestamp(ts)
print(f'Создан: {dt}')Создан: 2025-03-15 10:30:00.111111
Создание собственного декоратора для логирования времени создания функции (объекта-обёртки)
import datetime
import functools
def log_creation_time(func):
creation = datetime.datetime.now()
@functools.wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
wrapper.created_at = creation
return wrapper
@log_creation_time
def my_function():
pass
print(f'Функция создана (декорирована) в {my_function.created_at}')Функция создана (декорирована) в 2025-03-15 10:35:00.555555