Вы используете объект, содержащий ссылку нулевого значения. Таким образом, он дает пустое исключение. В примере строковое значение равно null, и при проверке его длины произошло исключение.
Пример:
string value = null;
if (value.Length == 0) // <-- Causes exception
{
Console.WriteLine(value); // <-- Never reached
}
Ошибка исключения:
Необработанное исключение:
System.NullReferenceException: ссылка на объект не установлена в экземпляр объекта. в Program.Main ()
blockquote>
Получение какой-либо даты модификации кросс-платформенным способом легко - просто вызовите os.path.getmtime(path)
, и вы получите отметку времени Unix, когда последний файл в path
был последним изменен.
Получение дат создания файла , с другой стороны, неудобно и зависит от платформы, различающееся даже между тремя большими ОС:
ctime
файла (задокументированный в https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx ) сохраняет дату создания. Вы можете получить доступ к этому в Python через os.path.getctime()
или атрибут .st_ctime
результата вызова os.stat()
. Этот не будет работать в Unix, где ctime
- последний раз, когда атрибуты или содержимое файла были изменены . .st_birthtime
результата вызова os.stat()
. ext4
хранит их в st_crtime
), ядро Linux не имеет доступа к ним ; в частности, структуры, которые он возвращает из вызовов stat()
в C, начиная с последней версии ядра, не содержат полей даты создания . Вы также можете видеть, что идентификатор st_crtime
в настоящее время не присутствует нигде в источнике Python . По крайней мере, если вы находитесь на ext4
, данные - , прикрепленные к inodes в файловой системе, но нет удобного способа доступа к нему. Следующей лучшей идеей в Linux является доступ к файлу mtime
с помощью либо os.path.getmtime()
, либо атрибута .st_mtime
результата os.stat()
. Это даст вам последний раз, когда содержимое файла было изменено, что может быть подходящим для некоторых случаев использования. Положив все это вместе, межплатформенный код должен выглядеть примерно так ...
import os
import platform
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
Лучшей функцией для этого является os.path.getmtime () . Внутри это просто использует os.stat(filename).st_mtime
.
Модуль datetime - лучший способ создания временных меток, поэтому вы можете получить дату модификации как объект datetime
следующим образом:
import os
import datetime
def modification_date(filename):
t = os.path.getmtime(filename)
return datetime.datetime.fromtimestamp(t)
Пример использования:
>>> d = modification_date('/var/log/syslog')
>>> print d
2009-10-06 10:50:01
>>> print repr(d)
datetime.datetime(2009, 10, 6, 10, 50, 1)
getmtime
- ближайшая вещь, доступная в Unix (где получение дат создания невозможно), но определенно не самая лучшая функция для использования в Windows, где ctime
- время создания.
– Mark Amery
12 September 2016 в 20:00
Есть два способа получить время мода, os.path.getmtime () или os.stat (), но ctime не является надежной кросс-платформенной (см. ниже).
getmtime ( путь ) Возвращает время последней модификации пути. Возвращаемое значение - это число, указывающее количество секунд с момента (см. Модуль времени). Поднимите os.error, если файл не существует или недоступен. Новое в версии 1.5.2. Изменено в версии 2.3: Если os.stat_float_times () возвращает True, результатом будет число с плавающей запятой.
stat ( путь ) Выполните системный вызов stat () по данному пути. Возвращаемое значение - это объект, атрибуты которого соответствуют членам структуры stat, а именно: st_mode (бит защиты), st_ino (номер inode), st_dev (устройство), st_nlink (количество жестких ссылок), st_uid (идентификатор пользователя владельца ), st_gid (идентификатор группы владельца), st_size (размер файла, в байтах), st_atime (время последнего доступа), st_mtime (время последней модификации контента), st_ctime (зависит от платформы, время изменения последних метаданных в Unix или время создания в Windows) :
>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
(33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732)
>>> statinfo.st_size
926L
>>>
В приведенном выше примере вы должны использовать statinfo.st_mtime или statinfo.st_ctime для получения mtime и ctime соответственно.
Я смог получить время создания в posix, запустив команду stat и выведя результат.
commands.getoutput('stat FILENAME').split('\"')[7]
Вернул стат вне python из терминала (OS X):
805306374 3382786932 -rwx------ 1 km staff 0 1098083 "Aug 29 12:02:05 2013" "Aug 29 12:02:05 2013" "Aug 29 12:02:20 2013" "Aug 27 12:35:28 2013" 61440 2150 0 testfile.txt
... где четвертое datetime - это создание файла (а не время смены времени, как отмечалось в других комментариях).
os.stat https://docs.python.org/2/library/stat.html#module-stat
изменить: в более новом коде вы, вероятно, должны использовать os.path.getmtime () (спасибо Кристиан Оудар), но обратите внимание, что он возвращает значение с плавающей запятой time_t с долей секунд (если ваша ОС поддерживает его)
os.path.getmtime()
существует с Python 1.5.2 (см. старые документы ), выпущенные до того, как я потерял большинство своих детских зубов и почти за десять лет до того, как вы написали оригинальную версию этого ответа.
– Mark Amery
12 September 2016 в 19:04
Если следующие символические ссылки не важны, вы также можете использовать встроенный os.lstat
.
>>> os.lstat("2048.py")
posix.stat_result(st_mode=33188, st_ino=4172202, st_dev=16777218L, st_nlink=1, st_uid=501, st_gid=20, st_size=2078, st_atime=1423378041, st_mtime=1423377552, st_ctime=1423377553)
>>> os.lstat("2048.py").st_atime
1423378041.0
os.stat
возвращает именованный кортеж с атрибутами st_mtime
и st_ctime
. Время модификации st_mtime
на обеих платформах; к сожалению, в Windows, ctime
означает «время создания», тогда как на POSIX это означает «время изменения». Я не знаю, как получить время создания на платформах POSIX.
dir(..)
на одном. Например. dir(os.stat(os.listdir('.')[0]))
– Evgeni Sergeev
16 October 2013 в 10:20
У вас есть несколько вариантов. Для этого вы можете использовать функции os.path.getmtime
и os.path.getctime
:
import os.path, time
print("last modified: %s" % time.ctime(os.path.getmtime(file)))
print("created: %s" % time.ctime(os.path.getctime(file)))
Другой вариант - использовать os.stat
:
import os, time
(mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(file)
print("last modified: %s" % time.ctime(mtime))
Примечание: ctime()
указывает, что not относится к времени создания в системах * nix, а скорее в последний раз, когда изменились данные inode. (спасибо kojiro за то, что этот факт более ясен в комментариях, предоставив ссылку на интересный пост в блоге)
ctime
обновляется всякий раз, когда mtime
делает (поскольку mtime
является «метаданные»), и поэтому ctime
обычно всегда равным или впереди i> mtime
. Обработка ctime
как "созданная" время, таким образом, не имеет никакого смысла. -1!
– Mark Amery
12 September 2016 в 20:15
os.stat
включает время создания. Нет никакого определения st_anything для элемента os.stat()
, который содержит время.
Итак, попробуйте это:
os.stat('feedparser.py')[8]
Сравните это с вашим создать дату в файле в ls -lah
Они должны быть одинаковыми.
>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>>
ext4
в Linux, и я хотел бы узнать, что происходит, когда Linux читает файлы, написанные Windows, или наоборот, учитывая, что они используютst_ctime
иначе. – Mark Amery 14 September 2016 в 23:59"w"
, он не заменяет его, он просто открывает существующий файл и обрезает его. Несмотря на то, что содержимое файла полностью не связано с тем, что было при создании, вам все равно будет сказано, что файл был «создан». задолго до текущей версии. И наоборот, редакторы, использующие атомарную замену в save (исходный файл заменяется новым временным файлом temp), показывают более новую дату создания, даже если вы просто удалили один символ. Используйте время модификации, не тратьте время на создание. – ShadowRanger 17 October 2016 в 14:00stat.st_ctime
более уместно, потому что во многих случаях время последнего изменения метаданных i> может быть временем создания (по крайней мереctime
ближе к реальное время создания i>, чемmtime
). Поэтому вы можете просто заменить свой фрагмент наstat = os.stat(path_to_file); try: return stat.st_birthtime; except AttributeError: return stat.st_ctime
. Как вы думаете? ура – olibre 7 August 2017 в 15:31ctime
всегда должны быть равны или позже i>, чемmtime
, потому что изменениеmtime
вызывает i> actime
изменяется (поскольку самmtime
рассматривается как «метаданные»). См. stackoverflow.com/a/39521489/1709587 , где я приводим примерный код, чтобы проиллюстрировать это. – Mark Amery 9 August 2017 в 11:08