2017-01-02 317 views
1

我有以下问题:在python中重新排序文件名

我需要加载几个数据文件。这些文件通过我的设备命名如下:

meas98.dat 
meas99.dat 
meas100.dat 
meas101.dat 

换句话说,没有前导零。因此,如果我通过

os.listdir 

得到它们的文件名按字母顺序排列,意为“meas100.dat”将是第一个。这显然不是我想要实现的。问题是做这件事最优雅的方式是什么?

我想出了(unelegant)的方法是:

  • 负载文件名
  • 提取filenumber
  • 顺序filenumber(获得索引)
  • 顺序与索引文件名

我很确定python有内置的东西,可以在加载文件时做到这一点...

+5

可能重复的[Python是否有一个内置函数的字符串自然排序?](http://stackoverflow.com/questions/4836710/does-python-have-a-built-in-function-for-string -natural-sort) – Mureinik

+0

编写一些自定义lambda函数来排序函数。按照filename.split排序('。')[ - 1] .replace('meas') –

回答

-1

也许,这将满足您的问题:

import re 

l = ['meas100.dat', 
    'meas101.dat', 
    'meas98.dat', 
    'meas99.dat'] 


sorted(l, key=lambda x: int(re.match('\D*(\d+)', x).group(1))) 

输出:

['meas98.dat', 'meas99.dat', 'meas100.dat', 'meas101.dat'] 
+0

下面的投票者请解释一下吗? –

2

使用slicing[4:-4]从文件名只得到号码 - 和sorted()将用它们来的文件名排序。

# random order 
l = [ 
    'meas98.dat', 
    'meas100.dat', 
    'meas99.dat', 
    'meas101.dat', 
    'meas1.dat', 
] 

sorted(l, key=lambda x: int(x[4:-4])) 

print(l) 

结果

['meas1.dat', 'meas98.dat', 'meas99.dat', 'meas100.dat', 'meas101.dat'] 
3
l = ['meas98.dat', 
    'meas99.dat', 
    'meas100.dat', 
    'meas101.dat'] 
l.sort(key=lambda i: int(i.strip('meas.dat'))) 

有一种pythonic的方法通过使用pathlib模块要做到这一点:

这是我ternimal文件:

~/so$ ls 
meas100.dat meas98.dat meas99.dat 

这是fi莱在python:

from pathlib import Path 
p = Path('/home/li/so/') 
list(p.iterdir()) 
[PosixPath('/home/li/so/meas99.dat'), 
PosixPath('/home/li/so/meas98.dat'), 
PosixPath('/home/li/so/meas100.dat')] 

看起来pathlib已经为你做这个排序,你可以一试。

+0

@格洛斯塔斯请接受关闭此问题的答案,这将节省其他人的时间。 –