在Python代码中,我应该在哪里为文件夹和子文件夹应用排序函数?

2024-04-19 20:18:23 发布

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

亲爱的,我需要你的帮助。你能解释一下我应该在什么时候(在哪个阶段)编写代码来对我的文件夹和子文件夹进行排序吗?你知道吗

在这些图像上,您可以看到我的文件夹和子文件夹结构:folderssubfolders。你知道吗

我希望我的所有文件夹和子文件夹对整数、'1'、'2'、…、'10'、'11'、。。。你知道吗

我想给这部分加些代码:

zoom_levels = [i for i in sorted(range(zoom_min, zoom + 1), key=int)]
folders_for_xtiles = [k for k in sorted(range(0, 2 ** zoom), key=int)]
for zoom_level, folder_for_xtile in itertools.product(zoom_levels, folders_for_xtiles):
    os.makedirs(os.path.join(path_to_tiles_folder, str(zoom_level), str(folder_for_xtile)))

但没有起作用。你知道吗

然后,当我用一个代码挖掘文件夹时,我在考虑放一个排序函数,但我不知道我需要从操作系统模块应用什么样的方法?地址:

for zoom_level in range(zoom_min, zoom + 1):
    xtile_path = os.path.join(path_to_tiles_folder, str(zoom_level))
    for xtile_number in range(0, 2 ** zoom):
        ytile_path = os.path.join(xtile_path, str(xtile_number))

谢谢大家


Tags: path代码in文件夹for排序osrange
2条回答

这看起来更像是一个操作系统行为,而不是Python行为。尝试用零填充文件夹名1到9。例如:

for zoom_level in range(zoom_min, zoom + 1):
    xtile_path = os.path.join(path_to_tiles_folder, str(zoom_level))
    for xtile_number in range(0, 2 ** zoom):
        xtile_folder_name = str(xtile_number).zfill(2) if len(str(xtile_number)) == 1 else str(xtile_number)
        ytile_path = os.path.join(xtile_path, xtile_folder_name)

大多数操作系统都不能很好地保证你在文件夹中看到文件的顺序。有些文件系统可能有一个可预测的顺序(比如按创建日期排序),但由于大多数操作系统支持多个不同的文件系统(可能有不同的顺序),这并没有多大帮助。相反,如果客户机程序关心文件名的顺序,则通常由每个读取文件名的客户机程序自行排序。许多低级程序不关心顺序,因此对于操作系统设计者来说,这可能是一个合理的选择(他们不想在不需要时强加排序文件名的开销)。你知道吗

因此,您遇到的问题实际上不是Python代码的问题。相反,这是IDE的一个问题,您可能无法更改。它按字母顺序对您创建的文件夹进行排序,这意味着102之前,就像bac之前一样。除非您的IDE有一些特性来改变它的排序方法(这似乎不太可能),否则您可能无法直接解决这个问题。你知道吗

操作系统提供的文件管理器可能会有不同的排序方式(并提供更多的排序选项)。许多程序对文件名使用所谓的“自然排序”。它将名称分为数字部分和非数字部分,然后将每个部分用作单独的排序步骤(相应的数字部分按数字排序,而不是按字典排序)。如果您正在编写自己的代码来显示文件夹,则可能需要进行复制,但在当前情况下,似乎没有必要这样做。你知道吗

不过,对你有帮助的是把名字归零。与其创建名为12的文件夹,不如创建0102。然后,朴素排序将10放在09之后,而不是放在12之间。以下是如何将文件夹创建逻辑更改为零填充数字:

zoom_levels = [i for i in range(zoom_min, zoom + 1)]
folders_for_xtiles = [k for k in range(0, 2 ** zoom]
for zoom_level, folder_for_xtile in itertools.product(zoom_levels, folders_for_xtiles):
    os.makedirs(os.path.join(path_to_tiles_folder,
                             format(zoom_level, '02'),
                             format(folder_for_xtile, '02')))

主要的变化是使用format而不是str将数字转换成字符串。我传递02格式化代码,告诉Python用前导零将数字填充到两位数。请注意,我从列表理解中删除了sorted调用,因为它们什么都不做(range已经按升序生成结果,这对我们来说并不重要)。你知道吗

显示的最后一个代码块表明,当您访问文件夹时,您是通过直接按编号重新创建名称,而不是浏览文件夹并向操作系统询问每个文件夹中出现的名称。如果这样做,就不需要关心文件夹的创建顺序(或者在其他程序中查看时它们的显示顺序)。如果您按顺序生成数字,那么您也将按顺序访问文件夹。文件系统提供什么顺序无关紧要,因为您不会询问文件系统有哪些文件夹,因为您提前知道它们的名称。你知道吗

相关问题 更多 >