你可以用O(n)
複雜做到這一點。具有sort
的解決方案具有O(n*log(n))
複雜性。
import os
from collections import namedtuple
directory = #file directory
os.chdir(directory)
newest_files = {}
Entry = namedtuple('Entry',['date','file_name'])
for file_name in os.listdir(directory):
name,ext = os.path.splitext(file_name)
cashed_file = newest_files.get(name)
this_file_date = os.path.getmtime(file_name)
if cashed_file is None:
newest_files[name] = Entry(this_file_date,file_name)
else:
if this_file_date > cashed_file.date: #replace with the newer one
newest_files[name] = Entry(this_file_date,file_name)
newest_files
是具有不帶擴展名與持有文件的完整文件名和修改日期命名的元組的值的鍵文件名的dictonary。如果遇到的新文件位於字典中,則將其日期與存儲在字典中的日期進行比較,並在必要時進行替換。
最後你有一個包含最新文件的字典。
然後,您可以使用此列表執行第二遍。請注意,字典中的查找複雜度爲O(1)
。因此查看字典中所有n
文件的整體複雜度爲O(n)
。
例如,如果你想只留下最新的文件具有相同的名稱,並刪除其他的,這可以通過以下方式獲得:
for file_name in os.listdir(directory):
name,ext = os.path.splitext(file_name)
cashed_file_name = newest_files.get(name).file_name
if file_name != cashed_file_name: #it's not the newest with this name
os.remove(file_name)
至於建議的Blckknght在評論中,你甚至可以避免第二遍,並刪除舊文件,只要加入一行代碼:
else:
if this_file_date > cashed_file.date: #replace with the newer one
newest_files[name] = Entry(this_file_date,file_name)
os.remove(cashed_file.file_name) #this line added
我不'不要以爲你應該關心將20000甚至200000個文件名加載到內存中。 –