2013-08-16 16 views
52

Próbuję znaleźć ostatnio zmodyfikowany plik "Odtąd najnowszy" określonego typu w języku Python. Obecnie mogę uzyskać najnowsze, ale nie ma znaczenia, jaki typ. Chciałbym dostać tylko najnowszy plik MP3.Python: Znajdź najnowszy plik z rozszerzeniem .MP3 w katalogu

Obecnie mam:

import os 

newest = max(os.listdir('.'), key = os.path.getctime) 
print newest 

Czy istnieje sposób zmodyfikować to tylko dać mi tylko najnowszy plik MP3?

+0

whats 'os'? – enginefree

+0

@enginefree: Jest to moduł w standardowej bibliotece dołączony do Pythona. Musisz tylko napisać 'import os', a następnie możesz wywołać [wszystkie przydatne funkcje w module] (http://docs.python.org/2/library/os.html). – abarnert

+0

@abarnert Wiem, czym jest moduł "os". Przysięgam, że tego nie komentowałem. Muszą być dwie sesje otwarte dwa moje konto lub coś takiego. – enginefree

Odpowiedz

88

Zastosowanie glob.glob:

import os 
import glob 
newest = max(glob.iglob('*.[Mm][Pp]3'), key=os.path.getctime) 
+2

Świetne rozwiązanie. Ale OP poprosił o '.MP3', więc chcę, aby' glob ('*. MP3') 'odpowiedział bezpośrednio na to pytanie, chociaż niewrażliwe na wielkość liter jest prawdopodobnie to, czego on chce. – abarnert

+0

@abarnert, Dziękuję za komentarz. Zaktualizowałem kod do 'MP3'. BTW, 'iglob' nie jest rozróżniana wielkości liter" glob ". – falsetru

+0

Nie istnieje bez znaczenia na wielkość liter 'glob'; musisz ręcznie użyć 'fnmatch' (w którym to momencie źródło z pliku' glob' docs służy jako świetny przykładowy kod). – abarnert

2

Daj ten facet spróbować:

import os 
print max([f for f in os.listdir('.') if f.lower().endswith('.mp3')], key=os.path.getctime) 
+0

Stosowanie metod łańcuchowych zamiast ścieżek na ścieżkach to dobry sposób na błędy krawędzi. Ale chyba że masz ku temu dobry powód, po co nawet próbować duplikować baterie ('glob' i' fnmatch') w stdlib? – abarnert

+0

Z powodu 300 uruchomień mój kod działa "18% szybciej" niż tamten falsetru – scohe001

+0

Czy myślisz, że czas będzie miał znaczenie w jakimkolwiek prawdziwym programie? Jeśli naprawdę zależy Ci na wydajności, zginiesz o 60-95% za pomocą interfejsów API niższego poziomu, dzięki którym uzyskasz statystyki każdego pliku podczas skanowania katalogu zamiast wywoływania statystyk na każdym z nich. – abarnert

11

Zakładając, że importowany os i zdefiniowane swoją drogę, to będzie działać:

dated_files = [(os.path.getmtime(fn), os.path.basename(fn)) 
       for fn in os.listdir(path) if fn.lower().endswith('.mp3')] 
dated_files.sort() 
dated_files.reverse() 
newest = dated_files[0][1] 
print(newest) 
+2

znacznie wyraźniejszy kod, a następnie zaakceptowana odpowiedź. – shaioz

-2
for file in os.listdir(os.getcwd()): 
    if file.endswith(".mp3"): 
     print "",file 
     newest = max(file , key = os.path.getctime) 
     print "Recently modified Docs",newest 
0

Do nauki pur stwarza tutaj mój kod, w zasadzie takie same jak z @Kevin Vincent choć nie tak zwarta, ale lepiej czytać i rozumieć:

import datetime 
import glob 
import os 

mp3Dir = "C:/mp3Dir/" 
filesInmp3dir = os.listdir(mp3Dir) 

datedFiles = [] 
for currentFile in filesInmp3dir: 
    if currentFile.lower().endswith('.mp3'): 
     currentFileCreationDateInSeconds = os.path.getmtime(mp3Dir + "/" + currentFile) 
     currentFileCreationDateDateObject = datetime.date.fromtimestamp(currentFileCreationDateInSeconds) 
     datedFiles.append([currentFileCreationDateDateObject, currentFile]) 
     datedFiles.sort(); 
     datedFiles.reverse(); 

print datedFiles 
latest = datedFiles[0][1] 
print "Latest file is: " + latest 
Powiązane problemy