我想知道如何对目录中的文件名进行排序。例如,我有以下名称:
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
...
我想要之前显示的订单。
答案 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+
将输入字符串拆分为交替数字和非数字。然后按数字比较数字,按字母顺序比较非数字。