有没有办法(比如php的natsort)对由文件名组成的列表进行排序,这些文件名只有一个数字不同,并且不会被glob返回,例如:
test1.dat
test7.dat
.
.
test10.dat
test3.dat
当我做一个天真的排序时,结果是
test1.dat
test10.dat
test2.dat
.
.
.
因为1发生在2之前:) 我可以使用for循环和范围(或带范围的发生器)构建一些东西,但这感觉有点不合理......
答案 0 :(得分:4)
sorted(glob.glob('*.dat'), key=lambda x: int(x.split('.')[0][4:]))
这将采用文件名,剥离扩展名并取第四个位置后的字符的整数值。适用于'testXXX.dat',其中XXX是任意长度的整数。
答案 1 :(得分:0)
使用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
和稍微复杂的解决方案。
答案 2 :(得分:0)
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)