2013-07-10 4 views
0

Мне нужно распечатать listdir текущего каталога, но отсортировано по типу файла. Что-то вроде этого:Listdir сортировка по расширению PYTHON

ASCII text: 
text 
bzip2 compressed data, block size = 900k: 
strace_4.5.20.orig.tar.bz2 
gzip compressed data, extra field, from Unix: 
openssh_5.8p1.orig.tar.gz 
gzip compressed data, from Unix, last modified: 
eglibc_2.11.2.orig.tar.gz 
strace_4.5.20-2.debian.tar.gz 
gzip compressed data, from Unix, max compression: 
openssh_5.8p1-2.debian.tar.gz 
PDF document, version 1.0: 
attestazione.pdf 
PDF document, version 1.2: 
risPP.9dic03.pdf 
risparz.7nov03.pdf 

Все это в python. На linux есть команда file. Как насчет в python?

ответ

1

Используйте модуль os, получите расширение файла с помощью os.path.splitext, а затем используйте list.sort.

import os 
files = os.listdir(path) 
def func(x): 
    return os.path.splitext(x)[::-1] 
files.sort(key = func) 

Демо:

>>> lis = ['file1.zip', 'file2.zip', 'inotify.c', 'cmpsource.c', 'myfile.h'] 
>>> def func(x): 
     return os.path.splitext(x)[::-1] 
>>> lis.sort(key = func) 
>>> lis 
['cmpsource.c', 'inotify.c', 'myfile.h', 'file1.zip', 'file2.zip'] 
+0

Кажется, что это нормально, но когда я пытаюсь использовать настоящий список файлов, я получаю не упорядоченный список по расширению. –

+0

@AntonioFalcone добавить, что настоящий список файлов в вопросе тела вместе с ожидаемым выходом. –

+0

проблема заключается в том, что «путь» - это только текущий путь к каталогу (в данном случае - «дом»), а не реальный путь к каждому файлу. –

0

Понял. Правильный метод сортировки был:

files = os.listdir(folder) 

files.sort(key=lambda f: os.path.splitext(f)[1]) 
+0

Это ** точно **, что я делал, кстати, это не будет сортироваться по имени файла. i.e 'file2.txt' может появиться перед' file1.txt'. –