重新排序 python 中的文件名

reordering filenames in python

我有以下问题:

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

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

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

获取文件名
os.listdir

它们按字母顺序排列,这意味着 "meas100.dat" 将是第一个。这显然不是我想要达到的。问题是这样做最优雅的方法是什么?

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

我很确定 python 有一些内置的东西可以在加载文件时执行此操作...

也许这会解决您的问题:

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

使用 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']
l = ['meas98.dat',
    'meas99.dat',
    'meas100.dat',
    'meas101.dat']
l.sort(key=lambda i: int(i.strip('meas.dat')))

有一个 pythonic 方法可以通过使用 pathlib 模块来做到这一点:

这是我终端中的文件:

~/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已经为你做了这件事,你可以试一试。