python中如何使用natsort对文件夹名称进行排序?

How to use natsort in python to sort folder names?

我有三个文件夹,名称是["-folder2-", "-folder1-", "=Folder-"]

当我使用 'sorted' 或 Window 时,它 returns ["-folder-", "-folder1-", "-folder2-"]。 但是使用 natsort,它 returns ["-folder1-", "-folder2-", "-folder-"].

我想通过使用 natsort 获得相同的结果 我该怎么做?

a = ["-folder1-", "-folder2-", "-folder-"]
import natsort
sorting = natsort.natsorted(a, alg = natsort.ns.PATH | natsort.ns.LOCALE | natsort.ns.IGNORECASE)
print(sorted(a)) #---> ["-folder-", "-folder1-", "-folder2-"]
print(sorting) #---> ["-folder1-", "-folder2-", "-folder-"]

在我回答你的问题之前,首先我想解释一下这是怎么回事。 natsort 正在查找您输入的数字并将它们与非数字部分分开。最简单的方法是查看自然排序键的输出。 (我省略了 PATHLOCALE 选项,因为它们完全破坏了输出)。

>>> import natsort
>>> ns_key = natsort.natsort_keygen(alg=natsort.IGNORECASE)
>>> a = ["-folder1-", "-folder2-", "-folder-"]
>>> [ns_key(x) for x in a]
[('-folder', 1, '-'), ('-folder', 2, '-'), ('-folder-',)]

'-folder''-folder-' 进行比较时,根据 Python 的排序规则,前者被认为排在第一位,因此您的带编号的文件夹排在第一位。

为了回答您的问题,我们需要让 natsort 认为 '-' 后面没有数字应该像处理数字一样处理。一种方法是使用正则表达式。

>>> import re
>>> r = re.compile(r"(?<!\d)-")
>>> # What does the regex do?
>>> [r.sub("0\g<0>", x) for x in a]
['0-folder1-', '0-folder2-', '0-folder0-']
>>> # What does natsort generate?
>>> ns_key = natsort.natsort_keygen(key=lambda x: r.sub("0\g<0>", x), alg=natsort.IGNORECASE)
>>> [ns_key(x) for x in a]
[('', 0, '-folder', 1, '-'), ('', 0, '-folder', 2, '-'), ('', 0, '-folder', 0, '-')]
>>> # Does it actually work?
>>> natsort.natsorted(a, key=lambda x: r.sub("0\g<0>", x), alg=natsort.ns.PATH | natsort.ns.LOCALE | natsort.ns.IGNORECASE)
['-folder-', '-folder1-', '-folder2-']

另一种方法是 "split" 您在 '-' 上的输入,这会产生类似的效果。这是 PATH 幕后的事情之一,但用于文件分隔符。

>>> # What does natsort generate?
>>> ns_key = natsort.natsort_keygen(key = lambda x: x.split('-'), alg=natsort.IGNORECASE)
>>> [ns_key(x) for x in a]
[((), ('folder', 1), ()), ((), ('folder', 2), ()), ((), ('folder',), ())]
>>> # Does it actually work?
>>> natsort.natsorted(a, key=lambda x: x.split('-'), alg=natsort.ns.PATH | natsort.ns.LOCALE | natsort.ns.IGNORECASE)
['-folder-', '-folder1-', '-folder2-']

您可能想知道为什么 PATH 不会自动处理这个问题。 PATH 旨在处理因文件分隔符或文件扩展名而出现的异常情况。你的例子两者都没有,所以它没有帮助。如果此处给出的示例具有代表性,我会建议删除 PATH 选项,因为它只会增加运行时间而不会带来任何好处。