touch
adalah utilitas Unix yang menetapkan waktu modifikasi dan akses file ke waktu saat ini. Jika file tidak ada, itu dibuat dengan izin default.
Bagaimana Anda mengimplementasikannya sebagai fungsi Python? Cobalah untuk menjadi lintas platform dan lengkap.
(Hasil Google saat ini untuk "file python touch" tidak terlalu bagus, tetapi arahkan ke os.utime .)
touch
fungsionalitas -seperti dalam program Python mereka, bukan bagaimana mengimplementasikannya kembali dari awal; orang-orang itu paling baik dilayani dengan menggulir ke bawah kepathlib
solusi. Meskipun sekarang sudah ada di dalamnya, jawaban ini memiliki peringkat Google yang jauh lebih baik untuk "file python touch" daripada dokumentasi yang relevan .Jawaban:
Sepertinya ini baru pada Python 3.4 -
pathlib
.Ini akan membuat
file.txt
di jalan.-
sumber
pip install pathlib
Path('/some/path').mkdir()
jika direktori yang berisi file yang akantouch()
diedit belum ada.pathlib2
bukanpathlib
karenapathlib
hanya bugfix sekarang. Oleh karena itu, pada Python 2.7:pip install pathlib2
dan kemudianfrom pathlib2 import Path
.Ini mencoba untuk menjadi sedikit lebih bebas dari solusi yang lain. (Kata
with
kunci tersebut baru dalam Python 2.5.)Kira-kira setara dengan ini.
Sekarang, untuk benar-benar membuatnya bebas perlombaan, Anda perlu menggunakan
futimes
dan mengubah stempel waktu dari filehandle yang terbuka, alih-alih membuka file dan kemudian mengubah stempel waktu pada nama file (yang mungkin telah diubah namanya). Sayangnya, Python tampaknya tidak menyediakan cara untuk meneleponfutimes
tanpa melaluictypes
atau serupa ...EDIT
Seperti dicatat oleh Nate Parsons , Python 3.3 akan menambahkan menentukan deskriptor file (kapan
os.supports_fd
) ke fungsi sepertios.utime
, yang akan menggunakanfutimes
syscall bukanutimes
syscall di bawah tenda. Dengan kata lain:sumber
file
fungsi bawaan dihapus dari Python 3, danopen
harus digunakan sebagai gantinya. Saya benar-benar merindukan ini karena penyorotan sintaks editor yang saya gunakan (gedit) masih menargetkan Python 2.sumber
open()
panggilan, maka konten file akan terpotong. Sarankan menggunakan mode'a'
sebagai gantinya.open(fname, 'a').close()
tidak akan mengubah atime.os.utime()
di sana untuk file yang sudah ada sebelumnya.Mengapa tidak mencoba ini ?:
Saya percaya ini menghilangkan kondisi ras yang penting. Jika file tidak ada maka pengecualian akan dibuang.
Satu-satunya kondisi ras yang mungkin di sini adalah jika file dibuat sebelum open () dipanggil tetapi setelah os.utime (). Tetapi ini tidak masalah karena dalam hal ini waktu modifikasi akan seperti yang diharapkan karena pasti terjadi selama panggilan untuk menyentuh ().
sumber
Berikut ini beberapa kode yang menggunakan ctypes (hanya diuji di Linux):
sumber
Jawaban ini kompatibel dengan semua versi sejak Python-2.5 ketika kata kunci
with
telah dirilis.1. Buat file jika tidak ada + Atur waktu sekarang
(persis sama dengan perintah
touch
)Versi yang lebih kuat:
2. Cukup buat file jika tidak ada
(tidak memperbarui waktu)
3. Cukup perbarui akses file / waktu yang dimodifikasi
(tidak membuat file jika tidak ada)
Penggunaan
os.path.exists()
tidak menyederhanakan kode:Bonus: Perbarui waktu semua file dalam direktori
sumber
sumber
with open(fn,'a'): pass
atau alternatifopen(fn, 'a').close()
tidak mengubah waktu yang dimodifikasi menggunakan Python 2.7.5 pada Red Hat 7 (filesystem adalah XFS). Di platform saya, solusi ini hanya membuat file kosong jika tidak ada. : - /Sederhana:
open
memastikan tidak ada fileutime
memastikan bahwa cap waktu diperbaruiSecara teoritis, ada kemungkinan seseorang akan menghapus file setelahnya
open
, menyebabkan utime memunculkan eksepsi. Tapi bisa dibilang itu tidak masalah, karena sesuatu yang buruk memang terjadisumber
Kompleks (mungkin bermasalah):
Ini mencoba juga memungkinkan pengaturan waktu akses atau modifikasi, seperti sentuhan GNU.
sumber
Tampaknya logis untuk membuat string dengan variabel yang diinginkan, dan meneruskannya ke os.system:
Ini tidak memadai dalam beberapa cara (misalnya, tidak menangani spasi putih), jadi jangan lakukan itu.
Metode yang lebih kuat adalah dengan menggunakan subproses:
subprocess.call(['touch', os.path.join(dirname, fileName)])
Meskipun ini jauh lebih baik daripada menggunakan subkulit (dengan osistem), itu masih hanya cocok untuk skrip cepat dan kotor; gunakan jawaban yang diterima untuk program lintas platform.
sumber
subprocess.call(['touch', os.path.join(dirname, fileName)])
jauh lebih baik daripada menggunakan subshell (withos.system
). Tapi tetap saja, gunakan ini hanya untuk skrip cepat dan kotor, gunakan jawaban yang diterima untuk program lintas platform.touch
bukan perintah lintas platform yang tersedia (mis. Windows)"open (file_name, 'a'). close ()" tidak bekerja untuk saya di Python 2.7 di Windows. "os.utime (file_name, None)" bekerja dengan baik.
Juga, saya memiliki kebutuhan untuk secara rekursif menyentuh semua file dalam direktori dengan tanggal yang lebih tua dari tanggal tertentu. Saya membuat hte berikut berdasarkan respon ephemient yang sangat membantu.
sumber
Mengapa Anda tidak mencoba: newfile.py
atau
sumber
Berikut ini sudah cukup:
Jika Anda ingin mengatur waktu tertentu untuk disentuh, gunakan os.utime sebagai berikut:
Di sini, atime dan mtime keduanya harus int / float dan harus sama dengan waktu zaman dalam detik dengan waktu yang ingin Anda atur.
sumber
Jika Anda tidak keberatan dengan coba-kecuali ...
Satu hal yang perlu diperhatikan, jika ada file dengan nama yang sama maka tidak akan berfungsi dan akan gagal diam-diam.
sumber
write_text()
daripathlib.Path
bisa digunakan.sumber