如何使用python按特定顺序对文件名进行排序

Posted

技术标签:

【中文标题】如何使用python按特定顺序对文件名进行排序【英文标题】:How to sort file names in a particular order using python 【发布时间】:2016-10-14 06:37:38 【问题描述】:

有没有一种简单的方法可以在 python 中对目录中的文件进行排序?我想到的文件按顺序排列为

file_01_001
file_01_005
...
file_02_002
file_02_006
...
file_03_003
file_03_007
...
file_04_004
file_04_008

我想要的是类似的东西

file_01_001
file_02_002
file_03_003
file_04_004
file_01_005
file_02_006
...

我目前正在使用glob 为目录打开它们,如下所示:

for filename in glob(path):    
    with open(filename,'rb') as thefile:
        #Do stuff to each file

因此,当程序执行所需的任务时,如果我一次执行多个文件,由于文件的顺序,它会提供不正确的数据。有什么想法吗?

【问题讨论】:

文件没有放置顺序。它们由您选择的文件资源管理器按特定值排序,例如名称、文件大小、添加日期等。因此,您不能对文件“做某事”并使它们在您的目录中排序。 请解释您的自定义顺序:您想要文件file_0x_00x(以增加x 的顺序),然​​后是file_0x_00y 其中y != x,以增加x 然后增加y 的顺序?跨度> 【参考方案1】:

如前所述,目录中的文件本身并不是以特定方式排序的。因此,我们通常 1) 获取文件名 2) 按所需属性对文件名进行排序 3) 按排序顺序处理文件。

您可以按如下方式获取目录中的文件名。假设目录是“~/home”那么

import os

file_list = os.listdir("~/home")

对文件名进行排序:

#grab last 4 characters of the file name:
def last_4chars(x):
    return(x[-4:])

sorted(file_list, key = last_4chars)   

所以看起来如下:

In [4]: sorted(file_list, key = last_4chars)
Out[4]:
['file_01_001',
 'file_02_002',
 'file_03_003',
 'file_04_004',
 'file_01_005',
 'file_02_006',
 'file_03_007',
 'file_04_008']

要按排序顺序读入和处理它们,请执行以下操作:

file_list = os.listdir("~/home")

for filename in sorted(file_list, key = last_4chars):    
    with open(filename,'rb') as thefile:
        #Do stuff to each file

【讨论】:

你也可以使用 lambda sorted(file_list, key=lambda x:x[-4:])【参考方案2】:

更好的解决方案是使用 Tcl 的“lsort -dictionary”:

from tkinter import Tcl
Tcl().call('lsort', '-dict', file_list)

Tcl 字典排序将正确处理数字,您将获得类似于文件管理器用于排序文件的结果。

【讨论】:

这种排序原理称为“自然排序”。如果您不想使用此依赖项,也可以自己轻松实现。参见例如here.

以上是关于如何使用python按特定顺序对文件名进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何按特定顺序对 .then() 调用进行排序? [复制]

如何按特定顺序对猫鼬进行排序?

如何使用 Matlab 按字母顺序对属性值对进行排序

如何在C中按顺序对带有数字和字母的文件名进行排序?

如何让 Jest 按特定顺序运行测试?

Vue.js - 如何按特定属性对数组中的对象进行排序并使用“v-for”进行渲染