我的目录中有一个文件列表,现在我打算将内容保存到数据库中。然而,在此之前,我需要按正确的顺序对它们进行排序。
当前排序如下:
['8.txt', '8-0.txt', '8-1.txt', '8-2.txt', '8-0-0.txt', '8-0-1.txt',
'8-0-2.txt', '8-0-3.txt', '8-1-0.txt', '8-2-0.txt', '8-2-1.txt']
我希望他们的顺序如下:
['8.txt', '8-0.txt', '8-0-0.txt', '8-0-1.txt', '8-0-2.txt', '8-0-3.txt',
'8-1.txt', '8-1-0.txt', '8-2.txt', '8-2-0.txt', '8-2-1.txt']
基本上,将这些文件视为帖子、评论和回复。
没有任何破折号的第一个文件“8.txt”是原始帖子。接下来我们有一组评论,例如“8-0.txt”、“8-1.txt”等,即文件名中的一个破折号。最后,对于每条评论,可能会有一些回复,其名称格式为“8-2-0.txt”、“8-2-1.txt”(2 个破折号)。
虽然我知道蛮力方式绝对可以进行这种排序,但我想知道是否有任何 Pythonic 方式(例如排序函数中的一些 lambda 函数)
现在我们可以假设文件名中最多只有 2 个破折号,即不超过 3 个层级。
非常感谢任何帮助!
最佳答案
困难在于正确地对类似于
的事物进行排序8-1-12.txt # simply removing non digits ==> 8112
8-11-2.txt # simply removing non digits ==> 8112 as well
简单的解决方案是利用 tuple
- 排序:
f = ['8.txt', '8-0.txt', '8-0-0.txt', '8-0-1.txt', '8-0-2.txt', '8-0-3.txt',
'8-1.txt', '8-1-0.txt', '8-2.txt', '8-2-0.txt', '8-2-1.txt','8-12-0.txt',
'8-1-12.txt', '8-11-2.txt']
def to_tuple(text):
"""Extract all numbers from file as tuple (8,1,3) ... etc."""
return tuple(map(int, text.split(".")[0].split("-") ))
f.sort(key = to_tuple)
print(f)
输出:
['8.txt', '8-0.txt', '8-0-0.txt', '8-0-1.txt', '8-0-2.txt', '8-0-3.txt',
'8-1.txt', '8-1-0.txt', '8-1-12.txt',
'8-2.txt', '8-2-0.txt', '8-2-1.txt',
'8-11-2.txt', '8-12-0.txt']
如果您的名称包含不可转换的内容,您需要使用 try: except:
并改进 to_tuple()
函数以正确处理您的名称。
关于python - 以特定方式对文件进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53481190/