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'
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'
Odpowiedzi:
Cokolwiek jest przypisane do fileszmiennej, jest nieprawidłowe. Użyj poniższego kodu.
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.Pathobiektami 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.getctimejako klucza, nawet w przypadku Pathobiektów.
max(files, key = os.path.getctime)
jest dość niekompletnym kodem. Co to jest files? Prawdopodobnie jest to lista nazw plików, wychodząca z os.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):
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')do rozumienia listy.
Sugerowałbym użycie glob.iglob()zamiast glob.glob(), ponieważ jest bardziej wydajny.
glob.iglob () Zwraca iterator, który zwraca te same wartości co glob () bez faktycznego przechowywania ich wszystkich jednocześnie.
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 maxfunkcji, 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])
max()rodzaj. W moim przypadku użyłem innego, key=os.path.basenameponieważ 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.
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]
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))
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
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
(Zredagowano, aby poprawić odpowiedź)
Najpierw zdefiniuj funkcję get_latest_file
def get_latest_file(path, *paths):
fullpath = os.path.join(path, paths)
...
get_latest_file('example', 'files','randomtext011.*.txt')
Możesz także użyć sznurka!
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)
Jeśli używasz Pythona 3 , możesz zamiast tego użyć iglob .
Uzupełnij kod, aby zwrócić nazwę najnowszego pliku:
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_VPNczęść?
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:
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,'*'))))
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
Znacznie szybsza metoda w systemie Windows (0,05 s), wywołaj skrypt nietoperza, który robi to:
get_latest.bat
@echo off
for /f %%i in ('dir \\directory\in\question /b/a-d/od/t:c') do set LAST=%%i
%LAST%
gdzie \\directory\in\questionjest katalog, który chcesz zbadać.
get_latest.py
from subprocess import Popen, PIPE
p = Popen("get_latest.bat", shell=True, stdout=PIPE,)
stdout, stderr = p.communicate()
print(stdout, stderr)
jeśli znajdzie plik, stdoutjest ścieżką i stderrma wartość Brak.
Użyj, stdout.decode("utf-8").rstrip()aby uzyskać użyteczną reprezentację ciągu nazwy pliku.
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.
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)