2

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

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

4 回答 4

2

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

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

0这将在排序时将每个文件名填充为 17 个字符;so1_00000_6.54.csv被填充到01_00000_6.54.csvwhile10_00000_1.70.csv保持原样。按字典顺序,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'))
于 2013-01-30T10:28:24.753 回答
0

基于此答案进行字母数字排序:

def group_uniqmz_intensities(path):
    pxlist = sorted(get_pixelist(path), key=lambda filename: int(filename.partition('_')[0]))
于 2013-01-30T10:37:46.100 回答
0

由于 '1' < '_' 你得到第二个排序。您可以通过为 sorted 提供关键功能来实现您的目标:

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

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

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

于 2013-01-30T10:32:44.530 回答
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']

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


编辑:这里介绍了一个更精细的自然排序解决方案:自然字符串排序

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

于 2013-01-30T10:40:22.500 回答