2015-11-29 3 views
0

У меня есть папка, где у меня есть имена, какPython сортировки файлов в папке ошибок

file_1.txt,file_2.txt,file_3.txt,file_10.txt,file_100.txt. 

Я читал эти файлы с помощью os.walk.i нужны имена печати файлов в отсортированный код order.My как следующим образом:

import os 
import fnmatch 
rootDir = "lecture1" 
for root, dirs, files in os.walk(rootDir): 
    files = sorted(files) 
    for file in fnmatch.filter(files, '*.wav'): 
     print os.path.join(rootDir, file) 

Но приведенный выше код не печатает файл в отсортированном order.Please предложить мне путь, так что я могу напечатать в отсортированном порядке, следующим образом:

file_1.txt,file_2.txt,file3_txt,file_10.txt,file_100.txt 

В настоящее время его печать

file_1.txt,file_1.txt,file_100.txt,file_2.txt,file_3.txt 
+0

Это ответили здесь: http://stackoverflow.com/questions/4836710/does-python-have-a-built-in-function-for-string-natural- Сортировать . В основном «сортировка» - это алгоритм сортировки по алфавиту, и вы хотите естественную сортировку, чтобы получить больше работы для этого. Либо вам нужно будет использовать модуль 're', либо написать функцию для сортировки или использовать библиотеку сторонней сортировки' natsort', как описано в этой ссылке. – dopstar

+0

related: [Python analog of natsort function (сортировать список, используя алгоритм «естественного порядка»)] (http://stackoverflow.com/q/2545532/4279) – jfs

ответ

0

Это не отсортирован выход, потому что

files = sorted(files) 

и файлы file_1.txt, file_100.txt и т.д.

Но как выше пример, file_1.txt или file_100.txt это строка, а sorted считается file_2.txt>file_100.txt т.к. '2'>'1' (примечание это '').

Чтобы объяснить это более ясно:

>>> '2' > '100' 
True 
>>> 2 > 100 
False 
>>> int('2') > int('100') 
False 
>>> 

Так что вам нужно использовать регулярное выражение, чтобы получить число, преобразовывать его Int Используйте int() функцию, а затем установить ключ сортировки, как следующий код:

import os 
import re 
import fnmatch 

rootDir = "lecture1" 

for root, dirs, files in os.walk(rootDir): 
    files.sort(key=lambda x: int(re.search('file_(\d+)\.txt', x).group(1))) 
    for file in fnmatch.filter(files, '*.wav'): 
     print os.path.join(rootDir, file) 
0
file_1.txt,file_1.txt,file_100.txt,file_2.txt,file_3.txt 

это лексикографическая сортировка, вам необходимо добавить собственный компаратор parse имя файла и сравнить номера в компараторе