Potrzebuję najnowszego pliku folderu przy użyciu języka Python. Podczas korzystania z kodu:
max(files, key = os.path.getctime)
Otrzymuję następujący błąd:
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'
python
python-3.x
python-2.7
garlapak
źródło
źródło
Odpowiedzi:
Cokolwiek jest przypisane do
files
zmiennej, jest nieprawidłowe. Użyj poniższego kodu.źródło
if os.path.isdir(latest_file):
pathlib.Path
obiektami niż ze stringami i os.path. W przypadku obiektów pathlib.Path odpowiedź brzmi:list_of_paths = folder_path.glob('*'); latest_path = max(list_of_paths, key=lambda p: p.stat().st_ctime)
os.path.getctime
jako klucza, nawet w przypadkuPath
obiektów.jest dość niekompletnym kodem. Co to jest
files
? Prawdopodobnie jest to lista nazw plików, wychodząca zos.listdir()
.Ale ta lista zawiera tylko części nazw plików (znane również jako „basenames”), ponieważ ich ścieżka jest wspólna. Aby poprawnie z niej korzystać musisz połączyć ją ze ścieżką do niej prowadzącą (i wykorzystaną do jej zdobycia).
Takich jak (nieprzetestowane):
źródło
if basename.endswith('.csv')
do rozumienia listy.Sugerowałbym użycie
glob.iglob()
zamiastglob.glob()
, ponieważ jest bardziej wydajny.Co oznacza,
glob.iglob()
że będzie bardziej wydajny.Najczęściej używam poniższego kodu, aby znaleźć najnowszy plik pasujący do mojego wzorca:
LatestFile = max(glob.iglob(fileNamePattern),key=os.path.getctime)
UWAGA: istnieją warianty
max
funkcji, w przypadku znalezienia najnowszego pliku użyjemy poniższego wariantu:max(iterable, *[, key, default])
który wymaga iterowalności, więc pierwszy parametr powinien być iterowalny. W przypadku znalezienia max of nums możemy skorzystać z wariantu beow:
max (num1, num2, num3, *args[, key])
źródło
max()
rodzaj. W moim przypadku użyłem innego,key=os.path.basename
ponieważ nazwy plików zawierały sygnatury czasowe.Spróbuj posortować elementy według czasu utworzenia. Przykład poniżej sortuje pliki w folderze i pobiera pierwszy element, który jest najnowszy.
źródło
Brakuje mi reputacji do komentowania, ale ctime z odpowiedzi Marlona Abejkoona nie dał mi prawidłowego wyniku. Jednak użycie mtime załatwia sprawę. (klucz = os.path.get m czas))
Znalazłem dwie odpowiedzi na ten problem:
python os.path.getctime max nie zwraca najnowszej Różnica między python - getmtime () i getctime () w systemie unix
źródło
(Zredagowano, aby poprawić odpowiedź)
Najpierw zdefiniuj funkcję get_latest_file
Możesz także użyć sznurka!
Jeśli używasz Pythona 3 , możesz zamiast tego użyć iglob .
Uzupełnij kod, aby zwrócić nazwę najnowszego pliku:
źródło
JuniperAccessLog-standalone-FCL_VPN
część?Próbowałem skorzystać z powyższych sugestii i mój program się zawiesił, ale zorientowałem się, że plik, który próbuję zidentyfikować, został użyty, a podczas próby użycia „os.path.getctime” uległ awarii. co w końcu zadziałało dla mnie to:
ten kod pobiera nietypowy obiekt między dwoma zestawami list plików nie jest to najbardziej eleganckie i jeśli wiele plików jest tworzonych w tym samym czasie, prawdopodobnie nie będzie stabilny
źródło
Znacznie szybsza metoda w systemie Windows (0,05 s), wywołaj skrypt nietoperza, który robi to:
get_latest.bat
gdzie
\\directory\in\question
jest katalog, który chcesz zbadać.get_latest.py
jeśli znajdzie plik,
stdout
jest ścieżką istderr
ma wartość Brak.Użyj,
stdout.decode("utf-8").rstrip()
aby uzyskać użyteczną reprezentację ciągu nazwy pliku.źródło
ls -Art | tail -n 1
. Prosimy o ocenę wydajności rozwiązania przed zgłoszeniem reklamacji.Używałem tego w Pythonie 3, w tym dopasowywanie wzorców w nazwie pliku.
źródło