Получение какой-либо даты модификации кросс-платформенным способом легко - просто вызовите 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
re.match
привязывается в начале строки. Это не имеет никакого отношения к новым строкам, таким образом, это не то же как использование ^
в шаблоне.
Как в re.match документации говорится:
, Если нуль или больше символов в начало строки соответствует образцу регулярного выражения, возвратите соответствие
MatchObject
экземпляр. ВозвратитесьNone
, если строка не соответствует шаблону; обратите внимание, что это отличается от соответствия нулевой длины.Примечание: Если Вы хотите определить местоположение соответствия где-нибудь в строке, используйте
search()
вместо этого.
re.search
поиски вся строка, как [1 123] в документации говорится :
Сканирование через строку поиск местоположения, где образец регулярного выражения производит соответствие и возвращает соответствие
MatchObject
экземпляр. ВозвратитесьNone
, если никакое положение в строке не соответствует шаблону; обратите внимание, что это отличается от нахождения соответствия нулевой длины в какой-то момент в строке.
Поэтому, если необходимо соответствовать в начале строки, или соответствовать всему строковому использованию match
. Это быстрее. Иначе используйте search
.
документация имеет определенный раздел для [1 111] по сравнению с [1 112] , который также покрывает многострочные строки:
Python предлагает две различных примитивных операции на основе регулярных выражений:
match
проверки на соответствие только вначале из строки, в то время какsearch
проверки на соответствие где угодно в строке (это - то, что Perl делает по умолчанию).Примечание, что
match
может отличаться от [1 116] даже когда с помощью регулярного выражения, начинающегося'^'
:'^'
соответствия только в начале строки, или в [1 119] режим также сразу после новой строки. “match
” операция успешно выполняется , только если матчи шаблона в эти начинаются из строки независимо от режима, или в стартовой позиции, данной дополнительнымpos
аргумент независимо от того, предшествует ли новая строка ему.
Теперь, достаточно разговора. Время для наблюдения некоторого примера кода:
# example code:
string_with_newlines = """something
someotherthing"""
import re
print re.match('some', string_with_newlines) # matches
print re.match('someother',
string_with_newlines) # won't match
print re.match('^someother', string_with_newlines,
re.MULTILINE) # also won't match
print re.search('someother',
string_with_newlines) # finds something
print re.search('^someother', string_with_newlines,
re.MULTILINE) # also finds something
m = re.compile('thing, re.MULTILINE)
print m.match(string_with_newlines) # no match
print m.match(string_with_newlines, pos=4) # matches
print m.search(string_with_newlines,
re.MULTILINE) # also matches
re.search
поиск es для шаблона всюду по строке , тогда как re.match
делает не, ищут шаблон; если это не делает, это не имеет никакого другого выбора, чем к соответствие это в начале строки.
re.match пытается соответствовать шаблону в начале строки . re.search пытается соответствовать шаблону всюду по строке , пока это не находит соответствие.