2013-08-16 16 views
52

Python'da belirli bir türde en son değiştirilen (Buraya 'dışarı' en yeni ') dosyayı bulmaya çalışıyorum. Şu anda en yeniyi alabilirim, ama ne tür bir önemi yok. Sadece en yeni MP3 dosyasını almak istiyorum. Python: .MP3 uzantısına sahip en yeni dosyayı bul

Şu anda var:

import os 

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

bir bu değiştirmek için bir yol bana sadece yalnızca en yeni MP3 dosyasını vermek var mı?

+0

Whats the os'? – enginefree

+0

@enginefree: Standart kütüphanede Python ile birlikte gelen bir modül var. Sadece 'import os' yazmanız gerekiyor ve daha sonra [modülün tüm kullanışlı fonksiyonlarını] arayabilirsiniz (http://docs.python.org/2/library/os.html). – abarnert

+0

@abarnert Os'un modülünün ne olduğunu biliyorum. Yemin ederim bunu yorumlamadım. İki hesap açmalıyım, hesabımı veya bir şeyimi aç. Karışıklığı önlemek için – enginefree

cevap

88

Kullanım glob.glob:

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

Harika çözüm. Ama OP sordu .MP3', bu yüzden soruyu doğrudan cevaplamak için glob ('*. MP3') 'istedim, büyük/küçük harf duyarsızlığı muhtemelen onun istediği şeydir. – abarnert

+0

@abarnert, Yorumunuz için teşekkür ederiz. Kodu "MP3" olarak güncelledim. BTW, 'iglob', glob’ün büyük/küçük harf duyarsız versiyonu değildir. – falsetru

+0

"glob" nin büyük küçük harf duyarlı olmayan bir sürümü yoktur; "fnmatch" işlevini el ile kullanmanız gerekir (bu noktada "glob" belgelerinden bağlanan kaynak mükemmel örnek kod olarak sunulur). – abarnert

2

Bu adama bir deneyin:

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

Yollarda yol yöntemleri yerine dize yöntemleri kullanmak, büyük/küçük harfe dönüştürmek için iyi bir yoldur. Ama bunu yapmak için iyi bir nedeniniz olmadıkça, neden stdlib'de piller ('glob' ve' fnmatch') kopyalanmaya çalışılsın? – abarnert

+0

300'den fazla çalıştırdığım için kodum, falsetru'dan – scohe001

+0

'a göre "% 18 daha hızlı" çalışıyor. Ve bu zamanın gerçek bir programda önemli olduğunu düşünüyor musunuz? Performansı gerçekten önemsiyorsanız, her birindeki istatistikleri çağırmak yerine dizini tararken her bir dosyanın istatistiklerini elde eden alt düzey API'leri kullanarak% 60-95 oranında traş olacaksınız. – abarnert

11

Eğer os ithal ve senin yolunu tanımladık varsayarsak, işe yarayacak:

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

çok daha temiz kod sonra cevap kabul edildi. – 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

Öğrenme öğrenmek için Burada benim kodum temelde, aynı derecede kompakt değil, fakat daha iyi okumak ve anlamak için @Kevin Vincent ile aynıdır:

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 
İlgili konular