2017-01-02 4 views
1

У меня проблема:переупорядочение имен файлов в python

Мне нужно загрузить несколько файлов данных. Файлы называются моим устройством:

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

Другими словами, нет начальных нулей. Поэтому, если я получаю имена файлов через

os.listdir 

они упорядочены в алфавитном порядке, а это означает «meas100.dat» будет первым. Это, очевидно, не то, чего я хочу достичь. Вопрос в том, что это самый элегантный способ сделать это?

The (unelegant) способ я придумал это:

  • нагрузки имена файлы
  • извлечь НомерФайл
  • заказать Номер_файл (получить индексы)
  • порядка имена файлов с этими индексами

Я уверен, что у python есть что-то встроенное, которое может это сделать при загрузке файлов ...

+5

Возможный дубликат [Есть ли у Python встроенная функция для строковой естественной сортировки?] (Http://stackoverflow.com/questions/4836710/does-python-have-a-built-in-function-for-string -natural-sort) – Mureinik

+0

Напишите функцию пользовательской лямбды для сортировки функции. Сортировка по 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'))) 

Существует вещий способ сделать это с помощью pathlib модуля:

это файлы в моем ternimal:

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

это ле в питоне:

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

@Glostas, пожалуйста, примите ответ, чтобы закрыть этот вопрос, это спасет чужие времена. –