2017-01-02 184 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

@格洛斯塔斯請接受關閉此問題的答案,這將節省其他人的時間。 –