重新排序 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
已经为你做了这件事,你可以试一试。
我有以下问题:
我需要加载多个数据文件。这些文件由我的设备命名为:
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
已经为你做了这件事,你可以试一试。