按特定顺序排序文件

时间:2013-01-30 10:20:00

标签: python sorting python-2.7

我想知道如何对目录中的文件名进行排序。例如,我有以下名称:

1_00000_6.54.csv
2_00000_1.70.csv
3_00000_1.70.csv
...
10_00000_1.70.csv
11_00000_1.70.csv
...

使用以下python代码,我得到以下顺序:

 def get_pixelist(path):
     return [os.path.join(path,f) for f in os.listdir(path) if f.endswith('.csv')]

 def group_uniqmz_intensities(path):
     pxlist = sorted(get_pixelist(path))

给出:

1_00000_6.54.csv
10_00000_1.70.csv
11_00000_1.70
...
2_00000_1.70.csv
...
3_00000_1.70.csv
...

我想要之前显示的订单。

4 个答案:

答案 0 :(得分:2)

最简单的方法是在排序时对文件名进行零填充:

def group_uniqmz_intensities(path):
    pxlist = sorted(get_pixelist(path), key=lambda f: f.rjust(17, '0'))

在排序时将每个文件名填充为17个字符,并带有0个字符;所以1_00000_6.54.csv填充到01_00000_6.54.csv,而10_00000_1.70.csv保留原样。用Lexographically 01排序10

我选择17作为硬编码值来简化事情;您可以使用此代码自动找到所需的值:

def group_uniqmz_intensities(path):
    padsize = max(len(f) for f in pxlist)
    pxlist = sorted(get_pixelist(path), key=lambda f: f.rjust(padsize, '0'))

答案 1 :(得分:0)

因为'1'< '_'你得到第二个订单。您可以通过提供按键功能来实现目标:

 def group_uniqmz_intensities(path):
     pxlist = sorted(get_pixelist(path), key=lambda x: int(x.split("_")[0]))

请确保所有文件都遵循相同的命名方案({number} _ {rest} .csv),否则会出现ValueError。

编辑:Martijn Pieters提供更优雅的解决方案。

答案 2 :(得分:0)

基于this answer进行字母数字排序:

def group_uniqmz_intensities(path):
    pxlist = sorted(get_pixelist(path), key=lambda filename: int(filename.partition('_')[0]))

答案 3 :(得分:0)

这是一个自然排序的简单实现,假设您的字段都被_分割:

def int_if_possible(s):
    try:
        return int(s)
    except:
        return s


>>> sorted(s, key=lambda s: map(int_if_possible, s.split('_')))
['1_00000_6.54.csv',
 '2_00000_1.70.csv',
 '3_00000_1.70.csv',
 '10_00000_1.70.csv',
 '11_00000_1.70.csv']

此实现利用了列表逐个元素进行比较的事实。如果元素可以转换为整数,我们将它们作为整数进行比较,否则我们会回到字符串比较。


修改:此处提供了一个更精细的自然排序解决方案:Natural string sorting

它非常聪明:它使用正则表达式\d+\D+将输入字符串拆分为交替数字和非数字。然后按数字比较数字,按字母顺序比较非数字。