python3.4中的文件路径排序

2024-04-25 05:08:55 发布

您现在位置:Python中文网/ 问答频道 /正文

好的,所以我需要在Python3.4中对文件路径列表进行排序。 它们需要按字母顺序排列,但子文件夹及其内容是第一位的

输出示例:

b/e/f.txt
b/d.txt
g/u.txt
i/a/q.txt
a.txt
c.txt
d.txt

在过去的几个小时里,我一直在努力想办法在谷歌上做到这一点,但没想到

恐怕我现在没有v2解释器的权限,所以我无法验证这一点的正确性,但在v2中,它看起来像这样:

^{pr2}$

Tags: 文件路径txt文件夹权限示例内容列表
3条回答

如果需要先对子文件夹进行排序,则需要提供两种排序依据:如果是子文件夹(TrueFalse之后排序),则需要提供两种方法进行排序:

sorted(paths, key=lambda p: (os.path.sep not in p, p))

它使用os.path.sep来确定路径是否是子文件夹的,因此您首先获取子文件夹。在

因此'a.txt'被转换为(True, 'a.txt'),而{}被排序为(False, 'b/d.txt');元组按字典顺序排序,其中{}在{}之前排序。在

如果您需要在浅层文件夹之前对文件夹进行排序,请计算分隔符的数量,并将其作为一个值返回;斜杠越多,文件夹的“深度”越大,它的排序将优先于其他文件夹:

^{pr2}$

演示:

>>> import os.path
>>> paths = '''\
... b/e/f.txt
... b/d.txt
... a.txt
... c.txt
... '''.splitlines()
>>> sorted(paths, key=lambda p: (os.path.sep not in p, p))
['b/d.txt', 'b/e/f.txt', 'a.txt', 'c.txt']
>>> import random
>>> random.shuffle(paths)
>>> sorted(paths, key=lambda p: (os.path.sep not in p, p))
['b/d.txt', 'b/e/f.txt', 'a.txt', 'c.txt']
>>> sorted(paths, key=lambda p: (-p.count(os.path.sep), p))
['b/e/f.txt', 'b/d.txt', 'a.txt', 'c.txt']

我知道我迟到了,但我自己也有这个问题,下面是我如何解决它的。我的方法是让sort函数将每个路径分割成inode(目录/文件)的列表,这样单个目录和文件就会相互比较,而不是比较整个路径。在

paths = [
    'b/e/f.txt',
    'b/d.txt',
    'a.txt',
    'c.txt',
]

for path in sorted(paths.keys(), key=lambda s: s.lower().split(os.path.sep)):
    print(path)

我使用lower(),因此我的路径按大小写不区分大小写排序,以避免输出如下所示:

^{pr2}$

排序顺序似乎取决于路径中子文件夹级别的数量。在

因此排序必须使用一个键,其中子文件夹级别的数量被考虑在内。最简单的方法是一个lambda函数,它将给我们提供子文件夹级别计数的元组和路径本身的名称。必须对计数器求反,以便具有更多子文件夹的路径将首先出现。在

paths = ['a.txt', 'b/d.txt', 'b/e/f.txt', 'c.txt']
paths.sort(key=lambda x: (-x.count('/'), x))

结果

^{pr2}$

相关问题 更多 >