Saya perlu mendapatkan file terbaru dari sebuah folder menggunakan python. Saat menggunakan kode:
max(files, key = os.path.getctime)
Saya mendapatkan kesalahan di bawah ini:
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'
python
python-3.x
python-2.7
garlapak
sumber
sumber
Jawaban:
Apapun yang ditugaskan ke
files
variabel salah. Gunakan kode berikut.sumber
if os.path.isdir(latest_file):
pathlib.Path
objek lebih dari sekedar string dan os.path. Dengan objek pathlib.Path jawaban Anda menjadi:list_of_paths = folder_path.glob('*'); latest_path = max(list_of_paths, key=lambda p: p.stat().st_ctime)
os.path.getctime
sebagai kunci, bahkan denganPath
objek.adalah kode yang tidak lengkap. Apa
files
? Ini mungkin adalah daftar nama file, keluar darios.listdir()
.Tetapi daftar ini hanya mencantumkan bagian nama file (alias "nama dasar"), karena jalurnya sama. Untuk menggunakannya dengan benar, Anda harus menggabungkannya dengan jalur yang mengarah ke sana (dan digunakan untuk mendapatkannya).
Seperti (belum teruji):
sumber
if basename.endswith('.csv')
ke dalam pemahaman daftar.Saya akan menyarankan untuk menggunakan
glob.iglob()
daripadaglob.glob()
, karena lebih efisien.Artinya
glob.iglob()
akan lebih hemat.Saya kebanyakan menggunakan kode di bawah ini untuk menemukan file terbaru yang cocok dengan pola saya:
LatestFile = max(glob.iglob(fileNamePattern),key=os.path.getctime)
CATATAN: Ada varian
max
fungsi, Jika menemukan file terbaru, kami akan menggunakan varian di bawah ini:max(iterable, *[, key, default])
yang membutuhkan iterable sehingga parameter pertama Anda harus dapat di iterable. Jika menemukan jumlah maksimum, kita dapat menggunakan varian beow:
max (num1, num2, num3, *args[, key])
sumber
max()
. Dalam kasus saya, saya menggunakan yang berbedakey=os.path.basename
karena nama file memiliki cap waktu di dalamnya.Cobalah untuk mengurutkan item berdasarkan waktu pembuatan. Contoh di bawah ini mengurutkan file dalam folder dan mendapatkan elemen pertama yang terbaru.
sumber
Reputasi saya kurang bagus untuk berkomentar tetapi respon dari Marlon Abeykoons tidak memberikan hasil yang benar untuk saya. Menggunakan mtime memang berhasil. (key = os.path.get m waktu))
Saya menemukan dua jawaban untuk masalah itu:
python os.path.getctime max tidak mengembalikan Perbedaan terbaru antara python - getmtime () dan getctime () di sistem unix
sumber
(Diedit untuk meningkatkan jawaban)
Pertama, tentukan fungsi get_latest_file
Anda juga dapat menggunakan docstring!
Jika Anda menggunakan Python 3 , Anda dapat menggunakan iglob sebagai gantinya.
Kode lengkap untuk mengembalikan nama file terbaru:
sumber
JuniperAccessLog-standalone-FCL_VPN
bagian itu?Saya telah mencoba menggunakan saran di atas dan program saya macet, daripada saya menemukan file yang saya coba identifikasi digunakan dan ketika mencoba menggunakan 'os.path.getctime' itu macet. yang akhirnya berhasil bagi saya adalah:
kode ini mendapatkan objek yang tidak biasa di antara dua set daftar file itu bukan yang paling elegan, dan jika banyak file dibuat pada saat yang sama itu mungkin tidak akan stabil
sumber
Metode yang jauh lebih cepat pada windows (0,05s), panggil skrip bat yang melakukan ini:
get_latest.bat
di mana
\\directory\in\question
direktori yang ingin Anda selidiki.get_latest.py
jika menemukan file
stdout
adalah path danstderr
tidak ada.Gunakan
stdout.decode("utf-8").rstrip()
untuk mendapatkan representasi string yang dapat digunakan dari nama file.sumber
ls -Art | tail -n 1
. Harap evaluasi kinerja solusi sebelum membuat klaim tentangnya.Saya telah menggunakan ini dengan Python 3, termasuk pencocokan pola pada nama file.
sumber