我应该在 Python 代码中的什么地方为文件夹和子文件夹应用一些排序功能?

Where should I apply some sorting function for folders and subfolders in Python code?

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

在图像上,您可以看到我的文件夹和子文件夹结构:

我希望我的所有文件夹和子文件夹都具有正常的整数升序样式,“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)))

但是没用。

然后我想在我的文件夹里用代码挖一个排序功能,但我不知道我需要从os模块申请什么样的方法?:

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))

谢谢大家

这看起来更像是 OS 行为而不是 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)

大多数 OS 不会对您在文件夹中看到文件的顺序做出强有力的保证。一些文件系统可能有一个可预测的顺序(例如按创建日期排序),但由于大多数 OS 支持多个不同的文件系统(它们可能有不同的顺序)这并没有多大帮助。相反,通常由读取文件名的每个客户端程序自行排序,如果它关心它们的顺序的话。许多低级程序不关心顺序,所以这可能是一个合理的选择OS 设计师(他们不想在不需要时强加对文件名进行排序的开销)。

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

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

不过,对名称进行零填充可能对您有所帮助。与其创建名为 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 已经按升序生成结果,但这对我们的目的来说并不重要)。

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