Python / Itertools:按名称获取最新文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python / Itertools:按名称获取最新文件相关的知识,希望对你有一定的参考价值。
我有一个目录中的文件名列表,我只想保留最新版本。该列表如下:
['file1-v1.csv', 'file1-v2.csv', 'file2-v1.txt', ...]
。
我只想按照版本(文件名中的-
之后的部分)和txt文件保留最新的csv文件。
输出将是[''file1-v2.csv', 'file2-v1.txt', ...]
我有一个解决方案,需要使用集合,但我正在寻找一个简单的pythonic方法来做到这一点。可能使用itertools
和groupby
更新:迄今为止的解决方案
我已经能够做一些初步工作来获得一个列表
lst = [('file1', 'csv', 'v1','<some data>'), ('file2', 'csv', 'v2','<some data>'), ...]
我想按索引0
和1
的元素分组,但只提供最大索引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))]
答案
你可以试试这个:
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)))
另一答案
我这样做:
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)
它与您现在发布的解决方案没有太大差别,但它确实正确地整理了不同的扩展并使用名称中的破折号处理文件名。
以上是关于Python / Itertools:按名称获取最新文件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 python itertools.groupby() 按字符串的第一个字符对字符串列表进行分组?