os.listdir (папка) функция, распечатывающая неправильный порядок файлов - PullRequest
0 голосов
/ 13 июля 2020

введите описание изображения здесь

В моей папке у меня есть следующий нормальный порядок моих файлов. Но когда я распечатываю файлы в python, используя следующий код:

for i in os.listdir(folder):
    print(i)

, я получаю следующий результат:

spam2.txt
spam304.txt
spam33000.txt
spam34.txt
spam4.txt

Что явно не в правильном порядке, как вы можете видеть, значения numeri c перепутаны неправильно.

Мой вопрос:

Функция os.listdir делает python это путь, и есть ли способ избежать этого?

Результат, который я пытаюсь получить:

spam2.txt
spam4.txt
spam34.txt
spam304.txt
spam3044.txt
spam33000.txt

Пожалуйста, если есть критика в мой вопрос, опубликуйте его ниже, я готов изменить свой вопрос, если да!

Ответы [ 2 ]

5 голосов
/ 13 июля 2020

Из документации os.listdir () :

Возвращает список, содержащий имена записей в каталоге, заданном путем. Список находится в произвольном порядке и не включает специальные записи '.' и '..', даже если они присутствуют в каталоге.

Чтобы получить порядок по числам, вы можете использовать, например, шаблон регулярного выражения:

import re 
import os 

files = os.listdir('data')
re_pattern = re.compile('.+?(\d+)\.([a-zA-Z0-9+])')
files_ordered = sorted(files, key=lambda x: int(re_pattern.match(x).groups()[0]))

output

In [1]: files
Out[1]: ['spam2.txt', 'spam3.txt', 'spam304.txt', 'spam3300.txt', 'spam34.txt']

In [2]: files_ordered
Out[2]: ['spam2.txt', 'spam3.txt', 'spam34.txt', 'spam304.txt', 'spam3300.txt']

Краткое объяснение:

  • sorted () принимает аргумент key, который можно использовать для сортировки вашего списка. Здесь мы читаем число перед точкой в ​​имени файла. Примечание : вы должны убедиться, что шаблон регулярного выражения соответствует всем вашим файлам.
  • .+? в начале соответствует чему угодно, но не является жадным (будет соответствовать всего лишь возможно)
  • (\d+) будет соответствовать и захватывать столько цифр, сколько есть, которые вы затем можете прочитать из .groups()[0].
  • \. будет соответствовать точке в имени файла
  • ([a-zA-Z0-9]+) будет соответствовать расширению файла (буквенно-цифровое c)
1 голос
/ 13 июля 2020

Попробуйте отсортировать по длине следующим образом:

import os
folder ="1"
for i in sorted(os.listdir(folder), key=len):
    print(i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...