Saya memiliki skrip yang perlu melakukan beberapa hal berdasarkan tanggal pembuatan & modifikasi file tetapi harus dijalankan di Linux & Windows .
Apa cara lintas platform terbaik untuk mendapatkan kreasi & modifikasi file date/times
dengan Python ?
Jawaban:
Mendapatkan semacam tanggal modifikasi dengan cara lintas-platform itu mudah - panggil saja dan Anda akan mendapatkan cap waktu Unix kapan file terakhir diubah.
os.path.getmtime(path)
path
Sebaliknya, mendapatkan tanggal pembuatan file sangat tergantung dan tergantung platform, bahkan berbeda antara tiga OS besar:
ctime
(didokumentasikan di https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx ) menyimpan tanggal pembuatannya. Anda dapat mengakses ini dengan Python melaluios.path.getctime()
atau.st_ctime
atribut hasil panggilanos.stat()
. Ini tidak akan berfungsi di Unix, di manactime
terakhir kali atribut atau konten file diubah ..st_birthtime
atribut hasil panggilanos.stat()
.Di Linux , saat ini tidak mungkin, setidaknya tanpa menulis ekstensi C untuk Python. Meskipun beberapa sistem file yang biasa digunakan dengan Linux melakukan tanggal pembuatan toko (misalnya,
ext4
menyimpannyast_crtime
), kernel Linux tidak menawarkan cara untuk mengaksesnya ; khususnya, struct yang dikembalikannya daristat()
panggilan dalam C, pada versi kernel terbaru, tidak mengandung bidang tanggal pembuatan . Anda juga dapat melihat bahwa pengidentifikasist_crtime
saat ini tidak memiliki fitur di mana pun di sumber Python . Setidaknya jika Anda berada diext4
, data yang melekat pada inode dalam sistem file, tetapi tidak ada cara yang nyaman untuk mengakses itu.Hal terbaik berikutnya di Linux adalah untuk mengakses file
mtime
, baik melaluios.path.getmtime()
atau.st_mtime
atribut dari suatuos.stat()
hasil. Ini akan memberi Anda terakhir kali konten file diubah, yang mungkin memadai untuk beberapa kasus penggunaan.Menyatukan semua ini, kode lintas-platform akan terlihat seperti ini ...
sumber
ext4
drive di Linux, dan saya ingin mempelajari apa yang terjadi ketika Linux membaca file yang ditulis oleh Windows, atau vica versa, mengingat bahwa mereka menggunakan secarast_ctime
berbeda."w"
, itu tidak akan menggantikannya, itu hanya membuka file yang ada dan memotongnya. Meskipun konten file sama sekali tidak terkait dengan apa pun yang ada pada pembuatan, Anda masih akan diberitahu bahwa file itu "dibuat" jauh sebelum versi saat ini. Sebaliknya, editor yang menggunakan penggantian atom pada save (file asli digantikan oleh file temp yang sedang dalam proses) akan menunjukkan tanggal pembuatan yang lebih baru, bahkan jika Anda baru saja menghapus satu karakter. Gunakan waktu modifikasi, jangan grub untuk waktu pembuatan.stat.st_ctime
lebih relevan karena, dalam banyak kasus, waktu perubahan metadata terakhir bisa menjadi waktu pembuatan (setidaknyactime
lebih dekat dengan waktu pembuatan sebenarnya daripadamtime
). Karenanya, Anda cukup mengganti snippet denganstat = os.stat(path_to_file); try: return stat.st_birthtime; except AttributeError: return stat.st_ctime
. Bagaimana menurut anda? Cheersctime
harus selalu sama dengan atau lambat dibandingkanmtime
, karena sebuahmtime
perubahan menyebabkan suatuctime
perubahan (karenamtime
itu sendiri dianggap "metadata"). Lihat stackoverflow.com/a/39521489/1709587 di mana saya memberikan beberapa contoh kode untuk menggambarkan hal ini.Anda punya beberapa pilihan. Untuk satu, Anda dapat menggunakan
os.path.getmtime
danos.path.getctime
fungsinya:Pilihan Anda yang lain adalah menggunakan
os.stat
:Catatan :
ctime()
tidak tidak mengacu pada waktu penciptaan pada sistem nix *, melainkan terakhir kali data inode berubah. (terima kasih kepada kojiro untuk membuat fakta itu lebih jelas di komentar dengan memberikan tautan ke posting blog yang menarik)sumber
ctime
akan diperbarui setiap kalimtime
tidak (karenamtime
merupakan "metadata"), sehinggactime
biasanya selalu sama untuk atau menjelang tersebutmtime
. Memperlakukanctime
waktu "diciptakan" tidak masuk akal sama sekali. -1!Last modified: Fri Jan 31 11:08:13 2020
danCreated: Fri Jan 31 11:08:13 2020
di Linux Ubuntu 16.04!time.ctime(os.path.getmtime(file))
mengembalikan 2 jenis string, tergantung apakah file telah dimodifikasi oleh sistem atau oleh pengguna. Jika telah dimodifikasi oleh sistem, string akan memiliki 2 spasi antara bulan dan hari. Saya tidak tahu mengapaFungsi terbaik yang digunakan untuk ini adalah os.path.getmtime () . Secara internal, ini hanya menggunakan
os.stat(filename).st_mtime
.Modul datetime adalah cap waktu manipulasi terbaik, sehingga Anda bisa mendapatkan tanggal modifikasi sebagai
datetime
objek seperti ini:Contoh penggunaan:
sumber
getmtime
adalah hal terdekat yang tersedia di Unix (di mana mendapatkan tanggal pembuatan tidak mungkin), tetapi jelas bukan fungsi terbaik untuk digunakan di Windows, di manactime
waktu pembuatannya adalah.os.stat https://docs.python.org/2/library/stat.html#module-stat
sunting: Dalam kode yang lebih baru Anda mungkin harus menggunakan os.path.getmtime () (terima kasih Christian Oudard)
tetapi perhatikan bahwa ia mengembalikan nilai floating point time_t dengan fraksi detik (jika OS Anda mendukungnya)
sumber
os.path.getmtime()
telah ada sejak Python 1.5.2 (lihat dokumen lama ), dirilis sebelum saya kehilangan sebagian besar gigi bayi saya dan hampir satu dekade sebelum Anda menulis versi asli dari jawaban ini.Ada dua metode untuk mendapatkan waktu mod, os.path.getmtime () atau os.stat (), tetapi ctime tidak dapat diandalkan lintas-platform (lihat di bawah).
os.path.getmtime ()
getmtime ( path )
Mengembalikan waktu modifikasi path terakhir. Nilai kembali adalah angka yang memberikan jumlah detik sejak zaman (lihat modul waktu). Naikkan os.error jika file tidak ada atau tidak dapat diakses. Baru dalam versi 1.5.2. Berubah dalam versi 2.3: Jika os.stat_float_times () mengembalikan True, hasilnya adalah angka floating point.
os.stat ()
stat ( jalur )
Lakukan panggilan sistem stat () di jalur yang diberikan. Nilai kembali adalah objek yang atributnya sesuai dengan anggota struktur stat, yaitu: st_mode (bit perlindungan), st_ino (nomor inode), st_dev (perangkat), st_nlink (jumlah tautan keras), st_uid (ID pengguna pemilik) ), st_gid (ID grup pemilik), st_size (ukuran file, dalam bytes), st_atime (waktu akses terkini), st_mtime (waktu modifikasi konten terkini), st_ctime (ketergantungan platform; waktu perubahan metadata terbaru) di Unix, atau saat pembuatan di Windows) :
Dalam contoh di atas Anda akan menggunakan statinfo.st_mtime atau statinfo.st_ctime untuk mendapatkan waktu mtime dan ctime.
sumber
Dalam Python 3.4 dan di atas, Anda dapat menggunakan antarmuka modul pathlib berorientasi objek yang mencakup pembungkus untuk sebagian besar modul os. Berikut adalah contoh untuk mendapatkan statistik file.
Untuk informasi lebih lanjut tentang apa yang
os.stat_result
mengandung, rujuk ke dokumentasi . Untuk waktu modifikasi yang Anda inginkanfname.stat().st_mtime
:Jika Anda ingin waktu pembuatan di Windows, atau perubahan metadata terbaru di Unix, Anda akan menggunakan
fname.stat().st_ctime
:Artikel ini memiliki informasi dan contoh yang lebih bermanfaat untuk modul pathlib.
sumber
os.stat
mengembalikan tuple dengan namast_mtime
danst_ctime
atribut. Waktu modifikasi adast_mtime
di kedua platform; sayangnya, pada Windows,ctime
berarti "waktu pembuatan", sedangkan pada POSIX itu berarti "ubah waktu". Saya tidak mengetahui cara apa pun untuk mendapatkan waktu pembuatan pada platform POSIX.sumber
dir(..)
salah satunya. Misalnyadir(os.stat(os.listdir('.')[0]))
cetakan
sumber
sumber
Jika tautan simbolis berikut tidak penting, Anda juga dapat menggunakan
os.lstat
builtin.sumber
Mungkin patut melihat
crtime
perpustakaan yang mengimplementasikan akses lintas platform ke waktu pembuatan file.sumber
debugfs
di Linux yang menurut definisi tidak stabil, membutuhkan akses root tingkat atas untuk semuanya dan hampir setiap aspek cenderung menjadi salah satu hal yang selalu diperingatkan ibu Anda. (Tapi ya, itu mungkin bekerja jika Anda benar-benar putus asa dan kebetulan menjadi penggunaos.stat
tidak termasuk waktu pembuatan. Tidak ada definisi st_anything untuk elemenos.stat()
yang mengandung waktu.Jadi coba ini:
os.stat('feedparser.py')[8]
Bandingkan dengan tanggal pembuatan Anda pada file di ls -lah
Mereka harus sama.
sumber
Saya bisa mendapatkan waktu pembuatan pada posix dengan menjalankan perintah stat sistem dan mem-parsing output.
Menjalankan stat di luar python dari Terminal (OS X) kembali:
... di mana datetime keempat adalah pembuatan file (bukan waktu perubahan waktu seperti komentar lain dicatat).
sumber