在python中重新排序文件名

时间:2017-01-02 10:25:23

标签: python python-2.7 listdir

我有以下问题:

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

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

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

获取文件名
os.listdir

它们按字母顺序排列,意思是" meas100.dat"将是第一个。这显然不是我想要实现的目标。问题是这样做最优雅的方式是什么?

我想出的(不雅)方式是:

  • 加载文件名
  • 提取文件编号
  • 订购文件编号(获取索引)
  • 使用这些索引订购文件名

我非常确定python有一些内置功能可以在加载文件时执行此操作...

3 个答案:

答案 0 :(得分:5)

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

使用pathlib模块有一种pythonic方法:

这是我的ternimal中的文件:

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

这是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为你做了这种,你可以尝试一下。

答案 1 :(得分:3)

使用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']

答案 2 :(得分: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']