Python'da dosya oluşturma ve değiştirme tarihini / saatlerini nasıl alabilirim?


932

Dosya oluşturma ve değiştirme tarihlerine göre bazı şeyler yapması gereken ancak Linux ve Windows üzerinde çalışması gereken bir komut dosyası var .

En iyi nedir platformlar arası dosya oluşturma ve değişiklik almanın yolu date/timesiçinde Python ?


57
Platformlar arası bir şekilde dosya oluşturma süresi elde edemezsiniz. Bkz. Docs.python.org/library/os.path.html#os.path.getctime
Glyph

Yanıtlar:


620

Platformlar arası bir şekilde bir tür değişiklik tarihi almak kolaydır - sadece arayın os.path.getmtime(path) almak ve Unix zaman damgasını dosyanın en pathson ne zaman değiştirildiğini elde edersiniz .

Dosya oluşturmaÖte yandan, tarihleri ​​almak üç büyük işletim sistemi arasında bile farklı ve platforma bağlıdır:

Bunu bir araya getirmek, platformlar arası kod böyle görünmelidir ...

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

9
Bunu bir araya getirmek için elimden geleni yaptım (ve bu süreçte araştırma yapmak için birkaç saat geçirdim) ve eminim daha önce burada bulunan cevaplardan en azından daha doğru , ama bu gerçekten zor bir konu ve ben d insanların sunabileceği düzeltmeleri, açıklamaları veya diğer girdileri takdir edin. Özellikle, ext4Linux altındaki sürücülerde bu verilere erişmenin bir yolunu oluşturmak istiyorum ve Linux, Windows tarafından yazılan dosyaları okuduğunda ya da tam tersi, st_ctimefarklı kullandıkları göz önüne alındığında ne olacağını öğrenmek istiyorum .
Mark Amery

25
Açıkçası, dosya oluşturma süresi genellikle oldukça işe yaramaz. Varolan bir dosyayı yazma modu ile açtığınızda "w", onun yerine geçmez, sadece varolan dosyayı açar ve keser. Dosya içeriği, oluşturma sırasındakiyle tamamen alakasız olsa da, dosyanın geçerli sürümden çok önce "oluşturulduğu" söylenir. Bunun tersine, kaydetme sırasında atomik değiştirmeyi kullanan orijinal dosyalar (orijinal dosya yeni devam eden geçici dosya ile değiştirilir), bir karakteri silseniz bile daha yeni bir oluşturma tarihi gösterir. Değişiklik zamanını kullanın, yaratma zamanı için gruba girmeyin.
ShadowRanger

3
Yıllar sonra, sonunda dosya oluşturma zamanı için bir kullanım buldum! Belirli dizinlerde bir dosya adlandırma kuralını kontrol etmek için kod yazıyorum, bu yüzden her şeyden önce ben ilk kongre kurulduktan sonra adlandırılmış dosyaları dikkate almak istiyorum. Tüm içeriğin (mtime) değiştirilmesi önemsizdir: zaten oradaysa dedesi
Steve Jessop

1
Merhaba Mark. Ben bir basitleştirme öneriyorum. Linux'ta geri dönüş stat.st_ctimedaha uygundur, çünkü çoğu durumda son meta veri değişikliğinin zamanı oluşturma süresi olabilir (en azından ctimegerçek oluşturma süresine daha yakındır mtime). Bu nedenle, snippet'inizi basitçe değiştirebilirsiniz stat = os.stat(path_to_file); try: return stat.st_birthtime; except AttributeError: return stat.st_ctime. Ne düşünüyorsun? Şerefe
olibre

4
@olibre "en azından ctime gerçek yaratma zamanına mtime'dan daha yakın" - hayır değil; Bu defalarca gördüğüm bir şey ama tamamen yanlış. El inode'daki değerlerle mahvettigini sürece ctimeher zaman için ya da eşit olmalıdır sonra daha mtimebir nedeni, mtimedeğişiklik neden bir ctime(çünkü değişim mtimekendisini "meta" olarak kabul edilir). Bkz. Stackoverflow.com/a/39521489/1709587 Burada bunu göstermek için örnek kod sağlarım.
Mark Amery

676

Birkaç seçeneğiniz var. Birincisi, os.path.getmtimeve os.path.getctimeişlevlerini kullanabilirsiniz :

import os.path, time
print("last modified: %s" % time.ctime(os.path.getmtime(file)))
print("created: %s" % time.ctime(os.path.getctime(file)))

Diğer seçeneğiniz os.statşunları kullanmaktır :

import os, time
(mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(file)
print("last modified: %s" % time.ctime(mtime))

Not : ctime()yok değil * Nix sistemlerde oluşturma zamana işaret ziyade son kez inode verileri değişti. (ilginç bir blog gönderisine bağlantı sağlayarak yorumlarda bu gerçeği daha açık hale getirdiği için kojiro'ya teşekkürler)


169
Herhangi birinin @ Glyph'in soruya verdiği yorumu kaçırması durumunda, ctime POSIX sistemlerinde oluşturma süresi anlamına gelmez . Son üç yılda kaç kişinin bu gönderiyi gözden kaçırdığını ve buggy kodu yazmaya devam ettiğini merak ediyorum.
kojiro

16
İlk örneğin size bir tarih veya sayı değil, bir dize verdiğini unutmayın.
gak

1
@kojiro bağlantı verdiğiniz blog yazısı Unix üzerinde bir dosyanın daha açıkça belirtilmesi olabilir ctimezaman güncellenir mtime(çünkü yaptığı mtime"meta" dir) ve böylece ctimenormalde her zaman eşit veya öncesindemtime . ctime"Yaratılmış" zaman olarak davranmak hiçbir anlam ifade etmiyor. -1!
Mark Amery

İlk seçeneğiniz, hem dosya oluşturma hem de son değişiklik için aynı sonuçları döndürür! Last modified: Fri Jan 31 11:08:13 2020ve Created: Fri Jan 31 11:08:13 2020Linux Ubuntu 16.04'te!
Färid Alijani

time.ctime(os.path.getmtime(file))Dosya sistem veya kullanıcı tarafından değiştirilmiş bağlı olarak, dizeleri 2 tür döndüren keşfetmek . Sistem tarafından değiştirildiyse, dizede ay ile gün arasında 2 boşluk olacaktır. Neden bilmiyorum
Matteo Antolini

376

Bunun için kullanılacak en iyi işlev os.path.getmtime () işlevidir . Dahili olarak, bu sadeceos.stat(filename).st_mtime .

Datetime modülü en iyi manipüle edilmiş zaman damgalarıdır, böylece değişiklik tarihini aşağıdaki gibi bir datetimenesne olarak alabilirsiniz :

import os
import datetime
def modification_date(filename):
    t = os.path.getmtime(filename)
    return datetime.datetime.fromtimestamp(t)

Kullanım örneği:

>>> 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)

1
Bu cevap da biraz yanlış. getmtimeUnix'te mevcut olan en yakın şeydir (oluşturma tarihlerini almak mümkün değildir), ancak kesinlikle ctimebir oluşturma zamanı olan Windows'ta kullanmak için en iyi işlev değildir .
Mark Amery

3
@MarkAmery - Bu cevap açıkça sadece değişiklik zamanı ile ilgili olarak etiketlenmiştir.
ArtOfWarfare

47

os.stat https://docs.python.org/2/library/stat.html#module-stat

edit: Yeni kodda muhtemelen os.path.getmtime () (teşekkürler Christian Oudard) kullanmalısınız,
ancak fraksiyon saniye ile time_t bir kayan nokta değeri döndürdüğünü unutmayın (işletim sisteminiz destekliyorsa)


44
os.path.getmtime () bunun için yapılır ve daha basittir.
Christian Oudard

5
Buradaki "yeni kodda" yan tümcesi biraz yanıltıcıdır. os.path.getmtime()Python 1.5.2'den beri ( eski belgelere bakın ), bebek dişlerimin çoğunu kaybetmeden önce ve bu cevabın orijinal versiyonunu yazmadan neredeyse on yıl önce piyasaya sürüldü.
Mark Amery

39

Mod zamanını almak için iki yöntem vardır, os.path.getmtime () veya os.stat (), ancak ctime güvenilir bir çapraz platform değildir (aşağıya bakınız).

os.path.getmtime ()

getmtime ( yol ) Yolun
son değiştirilme zamanını döndürür. Dönüş değeri, çağdan bu yana geçen saniye sayısını veren bir sayıdır (zaman modülüne bakın). Dosya yoksa veya erişilemiyorsa os.error öğesini kaldırın. 1.5.2 sürümündeki yenilikler. Sürüm 2.3'te değiştirildi: os.stat_float_times () değeri True değerini döndürürse, sonuç bir kayan nokta sayısıdır.

os.stat ()

stat ( yol )
Verilen yolda bir stat () sistem çağrısı gerçekleştirir. Dönüş değeri, öznitelikleri stat yapısının üyelerine karşılık gelen bir nesnedir: st_mode (koruma bitleri), st_ino (inode numarası), st_dev (aygıt), st_nlink (sabit bağlantı sayısı), st_uid (sahibin kullanıcı kimliği) ), st_gid (sahibinin grup kimliği), st_size (dosyanın boyutu, bayt cinsinden), st_atime (en son erişim zamanı ), st_mtime (en son içerik değiştirme zamanı), st_ctime (platforma bağlı; en son meta veri değişikliğinin zamanı) Unix veya Windows'ta oluşturulma zamanı) :

>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
(33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732)
>>> statinfo.st_size
926L
>>> 

Yukarıdaki örnekte, sırasıyla mtime ve ctime değerlerini almak için statinfo.st_mtime veya statinfo.st_ctime komutlarını kullanırsınız.


13

Python 3.4 ve üzeri sürümlerde , os modülünün çoğu için sarmalayıcılar içeren nesne yönelimli pathlib modül arayüzünü kullanabilirsiniz . İşte dosya istatistiklerini alma örneği.

>>> import pathlib
>>> fname = pathlib.Path('test.py')
>>> assert fname.exists(), f'No such file: {fname}'  # check that the file exists
>>> print(fname.stat())
os.stat_result(st_mode=33206, st_ino=5066549581564298, st_dev=573948050, st_nlink=1, st_uid=0, st_gid=0, st_size=413, st_atime=1523480272, st_mtime=1539787740, st_ctime=1523480272)

İçeriği hakkında daha fazla bilgi için belgelereos.stat_result bakın . İstediğiniz değişiklik zamanı için :fname.stat().st_mtime

>>> import datetime
>>> mtime = datetime.datetime.fromtimestamp(fname.stat().st_mtime)
>>> print(mtime)
datetime.datetime(2018, 10, 17, 10, 49, 0, 249980)

Windows'ta oluşturma zamanını veya Unix'te en son meta veri değişikliğini istiyorsanız, şunu kullanırsınız fname.stat().st_ctime:

>>> ctime = datetime.datetime.fromtimestamp(fname.stat().st_ctime)
>>> print(ctime)
datetime.datetime(2018, 4, 11, 16, 57, 52, 151953)

Bu makalede , pathlib modülü için daha yararlı bilgiler ve örnekler bulunmaktadır.


11

os.statst_mtimeve st_ctimeözniteliklerle adlandırılmış bir tuple döndürür . Modifikasyon süresi st_mtimeher iki platformdadır; maalesef Windows'ta ctime"oluşturma zamanı", POSIX'te ise "değişim zamanı" anlamına gelir. POSIX platformlarında oluşturma zamanını elde etmenin hiçbir yolunun farkında değilim.


Tagged tuples hakkında daha fazla bilgi: stackoverflow.com/questions/2970608/… Tuples gibi çalışıyorlar, ama bir tane deneyin dir(..). Ör.dir(os.stat(os.listdir('.')[0]))
Evgeni Sergeev

9
import os, time, datetime

file = "somefile.txt"
print(file)

print("Modified")
print(os.stat(file)[-2])
print(os.stat(file).st_mtime)
print(os.path.getmtime(file))

print()

print("Created")
print(os.stat(file)[-1])
print(os.stat(file).st_ctime)
print(os.path.getctime(file))

print()

modified = os.path.getmtime(file)
print("Date modified: "+time.ctime(modified))
print("Date modified:",datetime.datetime.fromtimestamp(modified))
year,month,day,hour,minute,second=time.localtime(modified)[:-3]
print("Date modified: %02d/%02d/%d %02d:%02d:%02d"%(day,month,year,hour,minute,second))

print()

created = os.path.getctime(file)
print("Date created: "+time.ctime(created))
print("Date created:",datetime.datetime.fromtimestamp(created))
year,month,day,hour,minute,second=time.localtime(created)[:-3]
print("Date created: %02d/%02d/%d %02d:%02d:%02d"%(day,month,year,hour,minute,second))

baskılar

somefile.txt
Modified
1429613446
1429613446.0
1429613446.0

Created
1517491049
1517491049.28306
1517491049.28306

Date modified: Tue Apr 21 11:50:46 2015
Date modified: 2015-04-21 11:50:46
Date modified: 21/04/2015 11:50:46

Date created: Thu Feb  1 13:17:29 2018
Date created: 2018-02-01 13:17:29.283060
Date created: 01/02/2018 13:17:29

-1: Diğer yanıtlarla aynı, bu size dosyanın Windows'ta oluşturulma zamanını vermeyecektir (bir kez daha yanıtta belirtilmemiş).
ntninja

@ntninja bundan emin misin? Ben sadece Windows kullanın ve bu kesinlikle işe yarıyor. 2015'in başlarında bu senaryoyu yazdım. Burada daha net, daha açık, tam ve kendi kendini açıklayan buluyorum. (ki eski senaryolarım yerine yeni bir şey olması durumunda buraya bakmaya karar verdim. hayır ... bu şekilde)
Puddle

Oh, “... Bu, size dosyanın oluşturulma zamanı vermeyecektir demek istedi sen olmadıkça Windows üzerinde”. Afedersiniz! Gerçek şu ki, bu cevap taşınabilir değil ve bu gerçeği belirtmiyor. (Linux'ta örnek çıktı: pastebin.com/50r5vGBE )
ntninja

@ntninja o zaman herkese söyleyecek misin?
birikintisi

Zaten burada başka yorumlar da bıraktım ve yakında (yakın zamanda) Linux üzerinde çalışan bir cevap göndereceğim. Ama gerçekten, yayınınızdaki tek şey, bu gerçeği belirtmeyen sadece Windows cevabı. Soruda OP özellikle Windows ve Linux uyumlu bir çözüm istedi. Bu nedenle, bu "ayrıntıyı" en üstte bir yere eklemeniz çok yararlı olacağını düşünüyorum, böylece insanlar birden fazla platformu hedeflerken aradıkları zamana yanlış yönlendirilmemelidir.
ntninja

2
>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>> 

-1: Başka bir yerde belirtildiği gibi, Windows'ta değilseniz (yanıt bile bahsetmez!), Bu size dosyanın oluşturulma zamanını vermeyecektir.
ntninja

0

Aşağıdaki sembolik bağlar önemli değilse, os.lstatyerleşik olanı da kullanabilirsiniz .

>>> 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

Bu, son okuma zamanını verecektir (en azından Unix'te), bu kesinlikle istenen şey değildir.
Mark Amery

0

crtimeDosya oluşturma süresine platformlar arası erişimi uygulayan kütüphaneye bir göz atmaya değer olabilir .

from crtime import get_crtimes_in_dir

for fname, date in get_crtimes_in_dir(".", raise_on_error=True, as_epoch=False):
    print(fname, date)
    # file_a.py Mon Mar 18 20:51:18 CET 2019

1
Şunu şiddetle öneriyorum: debugfsTanımı gereği kararsız olan, her şey için üst düzey kök erişimi gerektiren ve hemen hemen her açıdan annenizin sizi her zaman uyardığı şeylerden biri olma eğilimindedir. (Ama evet, muhtemelen gerçekten umutsuz ve güvenli önyükleme olmayan bir sistemde gerçek süper kullanıcı
olursanız çalışır

@ntninja Muhtemelen hiçbir zaman üretimde kullanmazdım, ama "ev komut dosyası" için yararlı olabilir.
Delgan

-2

os.statoluşturma süresini içerir. os.stat()Zaman içeren öğenin st_anything için tanımı yoktur .

Bu yüzden şunu deneyin:

os.stat('feedparser.py')[8]

Bunu, ls -lah dosyasındaki oluşturma tarihinizle karşılaştırın

Aynı olmalılar.


6
Yanlış! os.stat ('feedparser.py') [8] oluşturma zamanını değil, st_mtime'ı ifade eder. Lütfen belgelere bakın: docs.python.org/library/os.html#os.stat
millerdev

4
Lütfen çirkin sayılar yerine .st_ctime kullanın [8].
guettli

-3

Sistemin stat komutunu çalıştırarak ve çıktıyı ayrıştırarak posix üzerinde oluşturma zamanı elde etmeyi başardım.

commands.getoutput('stat FILENAME').split('\"')[7]

Terminalden (OS X) python dışında çalışan stat döndürdü:

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

... burada dördüncü datetime dosya oluşturmadır (diğer yorumlarda belirtildiği gibi ctime değişim zamanı yerine).


13
-1: Kabuk komutundan insanlar için bir çıktıyı ayrıştırmak çok kötü bir fikirdir. Ve bu komut çapraz uyumlu bile değil.
MestreLion
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.