1

我有以下问题:

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

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

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

os.listdir

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

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

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

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

4

3 回答 3

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

通过使用pathlib模块,有一种 Pythonic 方法可以做到这一点:

这是我的终端中的文件:

~/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有为你做的,你可以试试。

于 2017-01-02T10:48:30.563 回答
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']
于 2017-01-02T10:47:40.297 回答
2

也许这将适合您的问题:

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']
于 2017-01-02T10:42:42.197 回答