Saya punya script yang membutuhkan untuk melakukan beberapa hal-hal yang didasarkan pada pembuatan file & tanggal modifikasi, namun harus berjalan di Linux & Windows.
Apa's terbaik cross-platform cara mendapatkan file creation & tanggal modifikasi/kali di Python?
Anda memiliki beberapa pilihan. Untuk satu, anda dapat menggunakan os.jalan.getmtime
dan os.jalan.getctime
fungsi:
import os.path, time
print("last modified: %s" % time.ctime(os.path.getmtime(file)))
print("created: %s" % time.ctime(os.path.getctime(file)))
Anda pilihan lain adalah dengan menggunakan 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))
Catatan: ctime()
tidak not merujuk kepada penciptaan waktu pada sistem *nix, melainkan terakhir kali inode data berubah. (terima kasih kepada kojiro untuk membuat itu bahkan lebih jelas di komentar dengan memberikan link ke blog yang menarik post)
Mendapatkan semacam modifikasi upload di cross-platform dengan cara yang lebih mudah - hanya panggilan os.jalan.getmtime(jalan)
dan anda'll mendapatkan Unix timestamp dari file di path
terakhir diubah.
Untuk mendapatkan file pembuatan tanggal, di sisi lain, ini mengesalkan dan platform-dependent, yang berbeda bahkan di antara tiga besar Os:
ctime
(didokumentasikan di https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx) menyimpan tanggal pembuatan. Anda dapat mengakses di Python melalui os.jalan.getctime()
atau .st_ctime
atribut hasil dari panggilan untuk os.stat()
. Ini tidak't bekerja pada Unix, di mana ctime
adalah waktu terakhir bahwa file's atribut atau konten yang berubah..st_birthtime
atribut hasil dari panggilan untuk os.stat()
.ext4
toko-toko mereka di st_crtime
) , kernel Linux ini ada cara untuk mengaksesnya; secara khusus, struct ini kembali dari stat()
panggilan di C, seperti yang terbaru versi kernel, don't berisi tanggal pembuatan kolom. Anda juga dapat melihat bahwa identifier st_crtime
doesn't saat ini fitur di mana saja di Python sumber. Setidaknya jika anda'kembali pada ext4
, data adalah yang terpasang ke inode dalam file sistem, tetapi ada's tidak ada cara yang nyaman untuk mengakses itu.Berikutnya-hal terbaik di Linux untuk mengakses file's find
, baik melalui os.jalan.getmtime()
atau .st_mtime
atribut dari sebuah os.stat()
hasilnya. Ini akan memberi anda waktu terakhir file's konten yang dimodifikasi, yang mungkin cukup untuk beberapa kasus penggunaan.
Menempatkan semua ini bersama-sama, cross-platform kode harus melihat sesuatu seperti ini...
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
Fungsi terbaik untuk menggunakan untuk ini adalah os.jalan.getmtime(). Secara internal, ini hanya menggunakan os.stat(nama file).st_mtime
.
Datetime modul adalah yang terbaik memanipulasi waktu, agar anda bisa mendapatkan tanggal modifikasi sebagai datetime
objek seperti ini:
import os
import datetime
def modification_date(filename):
t = os.path.getmtime(filename)
return datetime.datetime.fromtimestamp(t)
Contoh penggunaan:
>>> 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)
os.stat https://docs.python.org/2/library/stat.html#module-stat
edit: baru Di kode anda mungkin harus menggunakan os.jalan.getmtime() (terima kasih Kristen Oudard) tetapi perhatikan bahwa ini akan menghasilkan sebuah nilai floating point dari time_t dengan sepersekian detik (jika OS anda mendukung itu)
Ada dua metode untuk mendapatkan mod, os.jalan.getmtime() atau os.stat(), tapi ctime tidak dapat diandalkan cross-platform (lihat di bawah).
getmtime(jalan)
Mengembalikan waktu modifikasi terakhir dari jalan. Nilai kembali adalah memberikan nomor
jumlah detik sejak epoch (lihat modul waktu). Meningkatkan os.error jika file tersebut
tidak ada atau tidak dapat diakses. Baru di versi 1.5.2. Berubah di versi 2.3: Jika
os.stat_float_times() mengembalikan True, hasilnya adalah floating point nomor.
stat(jalan)
Melakukan stat() system call pada path yang diberikan. Nilai kembali adalah sebuah objek yang
atribut yang sesuai untuk anggota stat struktur, yaitu: st_mode (perlindungan
bit), st_ino (nomor inode), st_dev (perangkat), st_nlink (jumlah link keras), st_uid
(user ID dari pemilik), st_gid (group ID pemilik), st_size (ukuran file dalam satuan byte),
st_atime (saat paling baru akses), st_mtime (time dari konten terbaru
modifikasi), st_ctime (tergantung platform; waktu paling terakhir perubahan metadata pada Unix, atau saat penciptaan pada Windows):
>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
(33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732)
>>> statinfo.st_size
926L
>>>
Dalam contoh di atas anda akan menggunakan statinfo.st_mtime atau statinfo.st_ctime untuk mendapatkan mtime dan ctime, masing-masing.
os.stat
kembali bernama tuple dengan st_mtime
dan st_ctime
atribut. Modifikasi kali ini adalah st_mtime
pada kedua platform; sayangnya, pada Windows, ctime
berarti "waktu pembuatan", sedangkan pada POSIX itu berarti "perubahan waktu". I'm tidak menyadari apapun cara untuk mendapatkan waktu pembuatan pada platform POSIX.
Di Python 3.4 dan di atas, anda dapat menggunakan object oriented pathlib modul antarmuka yang termasuk pembungkus untuk banyak os modul. Berikut adalah contoh dari mendapatkan file statistik.
>>> 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)
Untuk informasi lebih lanjut tentang apa yang os.stat_result
mengandung, merujuk ke dokumentasi. Untuk modifikasi kali anda ingin 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)
Jika anda ingin penciptaan waktu pada Windows, atau yang paling terakhir perubahan metadata pada Unix, anda akan menggunakan fname.stat().st_ctime
:
>>> ctime = datetime.datetime.fromtimestamp(fname.stat().st_ctime)
>>> print(ctime)
datetime.datetime(2018, 4, 11, 16, 57, 52, 151953)
Artikel ini telah lebih bermanfaat info dan contoh-contoh untuk pathlib modul.
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))
cetakan
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
Jika mengikuti link simbolik ini tidak penting, anda juga dapat menggunakan os.lstat
builtin.
>>> 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
tidak termasuk waktu pembuatan. Ada's hanya ada definisi st_anything untuk unsur os.stat()
yang berisi waktu.
Jadi cobalah ini:
os.stat('feedparser.py')[8]
Bandingkan dengan anda membuat tanggal pada file di ls -lah
Mereka harus sama.
Ini mungkin layak mengambil melihat crtime
library yang mengimplementasikan cross-platform akses untuk waktu pembuatan berkas.
`` dari crtime impor get_crtimes_in_dir
untuk fname, tanggal di get_crtimes_in_dir(".", raise_on_error=True, as_epoch=False): cetak(fname, tanggal)
Saya bisa mendapatkan waktu pembuatan pada posix dengan menjalankan sistem's stat perintah dan parsing output.
commands.getoutput('stat FILENAME').split('\"')[7]
Menjalankan stat luar python dari Terminal (OS X) kembali:
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
... di mana keempat datetime adalah pembuatan file (bukan ctime perubahan waktu seperti komentar lain mencatat).