簡體   English   中英

Python / Itertools:按名稱獲取最新文件

[英]Python/Itertools: Get latest file by name

我在目錄中有一個文件名列表,我只想保留最新版本。 該列表如下所示:

['file1-v1.csv', 'file1-v2.csv', 'file2-v1.txt', ...]

我只想按照版本(文件名中的-后)和txt文件保留最新的csv文件。

輸出為[''file1-v2.csv', 'file2-v1.txt', ...]

我有一個需要使用集合的解決方案,但我正在尋找一種簡單的pythonic方式來做到這一點。 可能使用itertoolsgroupby

更新:到目前為止的解決方案

我已經能夠做一些初步的工作來獲得像

lst = [('file1', 'csv', 'v1','<some data>'), ('file2', 'csv', 'v2','<some data>'), ...]

我想按索引01的元素進行分組,但僅提供具有最大索引2的元組。

可能類似於以下內容:

files = list(item for key, group in itertools.groupby(files, lambda x: x[0:2]) for item in group)
# Maximum over 3rd index element in each tuple does not work
files = max(files, key=operator.itemgetter(2))

另外,我覺得下面的方法應該可以,但是不能正確選擇最大值

[max(items, key=operator.itemgetter(2)) for key, items in itertools.groupby(files, key=operator.itemgetter(0, 1))]

我會這樣:

import os
import itertools

filenames = ['file1-v1.csv', 'file1-v2.csv', 'file1-v3.jpg', 'file2-v1.txt']


def split_filename(filename):
    basename, ext = os.path.splitext(filename)
    root, version = basename.rsplit('-v', 1)

    return root, ext, int(version)

def filter_latest_versions(filenames):
    parsed_filenames = sorted(map(split_filename, filenames))

    for _, matches in itertools.groupby(parsed_filenames, key=lambda f: f[:2]):
        root, ext, version = tuple(matches)[-1]

        yield '{}-v{}{}'.format(root, version, ext)

它與您現在發布的解決方案沒有太大不同,但是可以正確地整理出不同的擴展名並使用名稱中的破折號處理文件名。

您可以嘗試以下方法:

a = ['file1-v1.csv', 'file1-v2.csv', 'file2-v1.txt','file4-v1.csv','file2-v2.txt','file2-v3.txt']
d = {}
for i in a:
    x = i.split("-")
    d[x[0]]= x[1]
    if x[0] in d:
        d[x[0]] = x[1]
    else:
        d[x[0]] = x[1] 

for x,y in d.items():
    print('-'.join((x,y)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM