Python 根据字母数字日期对目录列表进行排序

Python 根据字母数字日期对目录列表进行排序,python,date,Python,Date,我有一个目录列表,我想根据日期和数字对列表进行排序。以下是未排序列表的示例: L = ['C:\\Users\\...\\file1\\sample_nov1_1', 'C:\\Users\\...\\file2\\sample_sep1_1', 'C:\\Users\\...\\file3\\sample_oct15_2', 'C:\\Users\\...\\file2\\sample_sep1_2', 'C:\\Users\\...\\file4\\samp

我有一个目录列表,我想根据日期和数字对列表进行排序。以下是未排序列表的示例:

L = ['C:\\Users\\...\\file1\\sample_nov1_1',
    'C:\\Users\\...\\file2\\sample_sep1_1',
    'C:\\Users\\...\\file3\\sample_oct15_2',
    'C:\\Users\\...\\file2\\sample_sep1_2',
     'C:\\Users\\...\\file4\\sample_sep10_2',
    'C:\\Users\\...\\file4\\sample_sep10_1']
我想对其进行排序,以便获得以下输出:

['C:\\Users\\...\\sample_sep1_1',
 'C:\\Users\\...\\sample_sep1_2',
 'C:\\Users\\...\\sample_sep10_1',
 'C:\\Users\\...\\sample_sep10_2',
 'C:\\Users\\...\\sample_oct15_1',
 'C:\\Users\\...\\sample_nov1_2']
我从父目录中走一走就得到了这个列表,但是因为这些文件不是按照我想要的输出顺序按时间顺序创建的,所以我不确定是否可以修改代码的这一部分。我已经看了一些其他的答案,例如,但是它们没有我在这里看到的那样复杂。我怎样才能做到这一点?我想使用正则表达式可以简化一点,但不确定这是否是正确的方法。

你能试试这个吗:

import os
from pathlib import Path

paths = sorted(Path("<file_dir>").iterdir(),key=os.path.getmtime)

print(paths)
导入操作系统
从pathlib导入路径
路径=已排序(路径(“”.iterdir(),key=os.Path.getmtime)
打印(路径)

也许它会对你有所帮助。

使用以下关键方法 它按字母顺序工作

month=[“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”]
L.sort(key=lambda value:(month.index(value.split(“”)2][3]),value.split(“”-2][3:),value.split(“”-1]))
印刷品(L)

到目前为止我已经知道了。有没有其他的测试边缘案例可以推荐


    month_value = {"jan": 1, "feb": 2, "mar": 3, "apr": 4, "may": 5, "jun": 6,
                   "jul": 7, "aug": 8, "sep": 9, "oct": 10, "nov": 11, "dec": 12}
    out = sorted(a, key=lambda x: (month_value[x.split("\\")[-1][7:][:3]], x.split("\\")[-1][7:][3:].split('_')))

这应该起作用:

import re

files = ['C:\\Users\\...\\sample_sep1_1',
 'C:\\Users\\...\\sample_sep1_2',
 'C:\\Users\\...\\sample_sep10_1',
 'C:\\Users\\...\\sample_sep10_2',
 'C:\\Users\\...\\sample_nov1_1',
 'C:\\Users\\...\\sample_oct15_2']

lf = [file.split("\\")[-1].split("_") for file in files]

R = []
for index, x in enumerate(lf):
    dval, num = x[1], int(x[2].split(".")[0])
    grps = re.match("([a-z]+)([0-9]+)", dval).groups()
    R.append((grps[0], int(grps[1]), num, files[index]))

month_map = {'jan': 1, 'feb': 2, 'mar': 3, 'apr': 4, 'may': 5, 'jun': 6, 'jul': 7, 'aug': 8, 'sep': 9, 'oct': 10, 'nov': 11, 'dec': 12}

sorted_files = sorted(R, key=lambda x: (month_map[x[0]], x[1], x[2]))
print(sorted_files)
输出:

[('sep', 1, 1, 'C:\\Users\\...\\sample_sep1_1'), ('sep', 1, 2, 'C:\\Users\\...\\sample_sep1_2'), ('sep', 10, 1, 'C:\\Users\\...\\sample_sep10_1'), ('sep', 10, 2, 'C:\\Users\\...\\sample_sep10_2'), ('oct', 15, 2, 'C:\\Users\\...\\sample_oct15_2'), ('nov', 1, 1, 'C:\\Users\\...\\sample_nov1_1')]


示例中的文件是否来自不同的目录??“…”部分可能不同吗?为了更清楚,我对问题进行了编辑。我希望它能澄清。它们只是在父目录中有所不同。OP已经提到,这些文件不是按时间顺序创建的。他想根据文件名排序。@serialazer对不起,你说得对。那么我的答案不适用于你的情况,对不起。这并不能正确地对月份进行排序。它在
sep
之前显示
nov
。感谢您的修复。现在它没有根据日期正确地对它们进行排序。请参见下面的示例:
L=['C:\\Users\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
但是应该返回:
['C:\\Users\\\…\\sample\u sep10\u 2,'C:\\Users\\…\\sample\u sep14\u 1','C:\\Users\\\\…\\sample\u sep16\u 2','C:\\Users\\\\\…\\sample\u sep16\u 1']
您的代码工作正常!非常感谢你!我将其标记为已接受的答案,因为它非常简洁和简单。对于我给出的示例来说效果很好,但当我在实际列表中尝试它时,它会引发一个错误:
ValueError:invalid literal for int(),以10为基数:“1.pdf”
@Rob您的文件是否没有您在问题中提到的名称?
.pdf
从何而来?老实说,如果你的问题提供了不完整的细节,这里的答案都不起作用。我没有料到这会带来巨大的变化。但是是的,所有的文件都是pdf文件,所以它们以
.pdf
结尾。我道歉@Shadowcoder的答案仍然有效,但它并没有按照日期顺序对它们进行排序。如果这个问题得到解决,它会起作用的。@Rob try now,我对使用扩展做了一个小改动。我在本地进行了验证,现在可以使用扩展了!