Python kullanarak bir klasörün en son dosyasını almam gerekiyor. Kodu kullanırken:
max(files, key = os.path.getctime)
Aşağıdaki hatayı alıyorum:
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'
Python kullanarak bir klasörün en son dosyasını almam gerekiyor. Kodu kullanırken:
max(files, key = os.path.getctime)
Aşağıdaki hatayı alıyorum:
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'
Yanıtlar:
files
Değişkene atanan şey yanlıştır. Aşağıdaki kodu kullanın.
import glob
import os
list_of_files = glob.glob('/path/to/folder/*') # * means all if need specific format then *.csv
latest_file = max(list_of_files, key=os.path.getctime)
print latest_file
if os.path.isdir(latest_file):
pathlib.Path
Nesnelerle çalışmayı dizeler ve os.path'den daha çok seviyorum. Pathlib.Path nesneleri ile cevabınız şöyle olur: list_of_paths = folder_path.glob('*'); latest_path = max(list_of_paths, key=lambda p: p.stat().st_ctime)
os.path.getctime
bile anahtar olarak kullanabilirsiniz Path
.
max(files, key = os.path.getctime)
oldukça eksik koddur. Nedir files
? Muhtemelen içinden çıkan dosya adlarının bir listesidir os.listdir()
.
Ancak bu liste yalnızca dosya adı parçalarını ("taban adları" olarak da bilinir) listeler, çünkü bunların yolu ortaktır. Doğru kullanmak için ona giden yolla birleştirmeniz (ve onu elde etmek için kullanmanız) gerekir.
Örneğin (test edilmemiş):
def newest(path):
files = os.listdir(path)
paths = [os.path.join(path, basename) for basename in files]
return max(paths, key=os.path.getctime)
if basename.endswith('.csv')
listeyi anlama bölümüne ekleyin .
Daha verimli olduğu için glob.iglob()
yerine kullanmanızı öneririm glob.glob()
.
glob.iglob () glob () ile aynı değerleri gerçekten aynı anda depolamadan veren bir yineleyici döndürür.
Bu glob.iglob()
da daha verimli olacak demektir .
Kalıbımla eşleşen en son dosyayı bulmak için çoğunlukla aşağıdaki kodu kullanıyorum:
LatestFile = max(glob.iglob(fileNamePattern),key=os.path.getctime)
NOT: max
Fonksiyonun çeşitleri vardır, en son dosyayı bulmamız durumunda aşağıdaki varyantı kullanacağız:
max(iterable, *[, key, default])
yinelenebilir olması gerekir, böylece ilk parametreniz yinelenebilir olmalıdır. Maksimum sayı bulma durumunda, sığır varyantını kullanabiliriz:max (num1, num2, num3, *args[, key])
max()
türden hoşlanıyorum . Benim durumumda, key=os.path.basename
dosya adlarında zaman damgaları olduğu için farklı bir kullandım .
Öğeleri oluşturma zamanına göre sıralamayı deneyin. Aşağıdaki örnek, bir klasördeki dosyaları sıralar ve en son olan ilk öğeyi alır.
import glob
import os
files_path = os.path.join(folder, '*')
files = sorted(
glob.iglob(files_path), key=os.path.getctime, reverse=True)
print files[0]
Yorum yapacak itibarım yok ama Marlon Abeykoons'un cevabından gelen ctime benim için doğru sonucu vermedi. Mtime kullanmak hile yapar. (anahtar = os.path.get m zamanı))
import glob
import os
list_of_files = glob.glob('/path/to/folder/*') # * means all if need specific format then *.csv
latest_file = max(list_of_files, key=os.path.getmtime)
print latest_file
Bu problem için iki cevap buldum:
python os.path.getctime max en son döndürmez Unix sisteminde python - getmtime () ve getctime () arasındaki fark
(Yanıtı iyileştirmek için düzenlendi)
Önce get_latest_file işlevini tanımlayın
def get_latest_file(path, *paths):
fullpath = os.path.join(path, paths)
...
get_latest_file('example', 'files','randomtext011.*.txt')
Ayrıca bir docstring de kullanabilirsiniz!
def get_latest_file(path, *paths):
"""Returns the name of the latest (most recent) file
of the joined path(s)"""
fullpath = os.path.join(path, *paths)
Python 3 kullanıyorsanız iglob'u kullanabilirsiniz yerine .
En son dosyanın adını döndürmek için kodu tamamlayın:
def get_latest_file(path, *paths):
"""Returns the name of the latest (most recent) file
of the joined path(s)"""
fullpath = os.path.join(path, *paths)
files = glob.glob(fullpath) # You may use iglob in Python3
if not files: # I prefer using the negation
return None # because it behaves like a shortcut
latest_file = max(files, key=os.path.getctime)
_, filename = os.path.split(latest_file)
return filename
JuniperAccessLog-standalone-FCL_VPN
?
Yukarıdaki önerileri kullanmaya çalıştım ve programım çöktü, tanımlamaya çalıştığım dosyanın kullanıldığını anladım ve 'os.path.getctime' kullanmaya çalışırken çöktü. sonunda benim için işe yarayan şuydu:
files_before = glob.glob(os.path.join(my_path,'*'))
**code where new file is created**
new_file = set(files_before).symmetric_difference(set(glob.glob(os.path.join(my_path,'*'))))
bu kodlar, iki dosya listesi arasındaki nadir nesneyi alır, en zarif değildir ve aynı anda birden fazla dosya oluşturulursa, muhtemelen kararlı olmayacaktır.
Windows (0.05s) üzerinde çok daha hızlı bir yöntem, bunu yapan bir bat betiği çağırın:
get_latest.bat
@echo off
for /f %%i in ('dir \\directory\in\question /b/a-d/od/t:c') do set LAST=%%i
%LAST%
\\directory\in\question
araştırmak istediğiniz dizin nerede .
get_latest.py
from subprocess import Popen, PIPE
p = Popen("get_latest.bat", shell=True, stdout=PIPE,)
stdout, stderr = p.communicate()
print(stdout, stderr)
bir dosya bulursa stdout
, yol vestderr
Yoktur.
stdout.decode("utf-8").rstrip()
Dosya adının kullanılabilir dize temsilini elde etmek için kullanın .
ls -Art | tail -n 1
. Lütfen iddialarda bulunmadan önce bir çözümün performansını değerlendirin.
Bunu Python 3'te dosya adında kalıp eşleştirme dahil kullanıyorum.
from pathlib import Path
def latest_file(path: Path, pattern: str = "*"):
files = path.glob(pattern)
return max(files, key=lambda x: x.stat().st_ctime)