У меня есть список файлов с именами:
file1.jpg
file2.jpg
.
.
.
где иногда есть дубликат, поэтому правильный порядок должен быть:
fileN.jpg
fileN 1.jpg
fileN 2.jpg
нет:
fileN 1.jpg
fileN 2.jpg
fileN.jpg
Обратите внимание, что в моем случае строка fileN может содержать специальные символы (включая пробелы). С помощью следующего скрипта Python я получаю почти то, что хочу, но с неправильным порядком для специального дублирующегося случая (т. е. последнего примера выше, а не предыдущего).
import os;
files = os.listdir(os.path.curdir)
files.sort()
for file in files:
print(file)
Как мне получить правильный порядок, как показано во втором фрагменте кода? (Я уверен, что для сортировки, которую я ищу, существует более элегантное имя CS - эта терминология также будет оценена по достоинству. Я предполагаю, что что-то вроде этого вопроса задавалось раньше, но у меня возникли проблемы с формулировкой правильного запроса.)






Вы можете использовать шаблон (?i)([^\r\n]*)?([0-9]*)\.(?:jpe?g|png|gif)), чтобы разделить имя файла, а затем передать его как ключ методу sort():
import os, re
def _order(s):
p = re.findall(r'(?i)([^\r\n]*)?([0-9]*)\.(?:jpe?g|png|gif)', s)
if p:
base, num = p[0][0], int(p[0][1]) if p[0][1] else 0
return (base, num)
return (s, 0)
files = os.listdir(os.path.curdir)
# files = ['fileN.jpg', 'fileN 1.jpg', 'fileN 2.jpg']
files.sort(key=_order)
for file in files:
print(file)
sort принимает дополнительную функцию key, которая позволяет вам управлять порядком сортировки.
Что вы можете сделать, так это разделить файлы на имя и расширение с помощью .split('.'). Это превращает file1 1.jpg в ['file 1', 'jpg'] — не навсегда; временно, в целях сортировки. Python, естественно, поставит ['file1', 'jpg'] перед ['file1 1', 'jpg'], давая вам желаемый порядок сортировки.
>>> files.sort(key=lambda name: name.split('.'))
>>> files
['file1.jpg', 'file1 1.jpg', 'file1 2.jpg', 'file2.jpg', 'file2 1.jpg', 'file2 2.jpg']