按编号对文件名列表排序

2024-09-29 01:36:29 发布

您现在位置:Python中文网/ 问答频道 /正文

是否有一种方法(如php的natsort)对一个由文件名组成的列表进行排序,这些文件名只在一个数字上有所不同,并且由glob未排序返回,例如:

test1.dat
test7.dat
.
.
test10.dat
test3.dat

当我做一个天真的排序结果是

^{pr2}$

因为1发生在2之前:) 我可以用for循环和range(或者带有range的生成器)构造一些东西,但是这感觉有点不和谐。。。在


Tags: 方法列表排序文件名range数字globdat
3条回答

eumiro的回答是好的。我只想增加一种更灵活的方法:

def natural_sort(data):
    convert = lambda text: int(text) if text.isdigit() else text.lower()
    alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
    return sorted(data, key=alphanum_key)
sorted(glob.glob('*.dat'), key=lambda x: int(x.split('.')[0][4:]))

这将获取文件名,去掉扩展名,并获取第四个位置后字符的整数值。为'测试xxx.dat'其中XXX是任意长度的整数。在

使用re(未测试)的解决方案:

prefix_number=re.compile(r'(.*)(\d+)\.dat$')
def sortkey(ss):
    match=prefix_number.match(ss)
    if(match):
       return (match.group(0),int(match.group(1))
    else:
       return (ss,)

sorted(glob.iglob('*.dat'), key=sortkey )

此解决方案通过按前缀(例如“test”)和整数(例如1)拆分文件名。然后它首先按前缀排序,然后按整数排序。当然,缺点是您需要re和稍微复杂一些的解决方案。在

相关问题 更多 >