Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按特定顺序对文件进行排序_Python_Sorting_Python 2.7 - Fatal编程技术网

Python 按特定顺序对文件进行排序

Python 按特定顺序对文件进行排序,python,sorting,python-2.7,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('.c

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

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
...

我想要前面显示的顺序。

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

def group_uniqmz_intensities(path):
    pxlist = sorted(get_pixelist(path), key=lambda f: f.rjust(17, '0'))
排序时,将每个文件名填充为17个字符,其中包含
0
字符;因此,
1_00000\u 6.54.csv
被填充到
01_00000\u 6.54.csv
,而
10_00000\u 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'))

由于“1”<“\u”,您将获得第二次订购。您可以通过为以下各项提供关键功能来实现您的目标:

 def group_uniqmz_intensities(path):
     pxlist = sorted(get_pixelist(path), key=lambda x: int(x.split("_")[0]))
请确保所有文件都遵循相同的命名方案({number}{rest}.csv),否则将出现ValueError

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

基于字母数字排序:

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

这里是自然排序的一个简单实现,假设您的字段都被
\uuu
拆分:

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']
此实现利用了列表可以逐个元素进行比较的事实。如果元素可转换为int,则将它们作为int进行比较,否则将返回字符串比较


编辑:这里提供了一个更详细的自然排序解决方案:


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

好问题。你所问的有时被称为;为此制作一个Python
键是有意义的。很好!为确保其正常工作,应将17更改为最长文件名的长度。比如max_length=len(max(获取像素列表(path),key=lambda x:len(x))。我会用
str.zfill
而不是
str.rjust
谢谢Martijn。这不是我想要的。我想要以下顺序: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@HocineBen这正是您通过此解决方案获得的结果。@HocineBen请参阅我的上述评论。请尝试将17更改为25(或一些大数字)看看是否有帮助。