如何在Python中将所导入文件按序号进行排序?

Abstract

写代码时导入复杂文件名的文件需要耗费很多脑细胞,尤其是在对他们进行排序的时候,更是如此。我身边好多同学通过手动操作,手动改名,批量改名和开头➕00等方式让文件名顺利排序,但这些都不是最简单的方法,下面我将介绍我所知道的文件导入方法。

假设我一堆图像,它们的名字如下:
在这里插入图片描述
我们的目标是将它们以图片中的顺序导入。

注:此方法看似很麻烦,其实很简单。

一、导入数据的方式

1.通过os导入

import os

images = os.listdir("file") #文件夹名

print(images)

=====>
['2-55frame.png', '41-255frame.png', '10-95frame.png', '1-70frame.png', '41-270frame.png', '41-305frame.png', '10-85frame.png', '10-125frame.png', '1-55frame.png', '2-110frame.png', '41-240frame.png', '2-90frame.png', '10-115frame.png', '1-110frame.png', '10-75frame.png', '2-65frame.png', '10-105frame.png', '1-40frame.png']

可以发现顺序几乎都是乱的,尝试使用sort函数进行排序。

images.sort()
print(images)

====>
['1-110frame.png', '1-40frame.png', '1-55frame.png', '1-70frame.png', '10-105frame.png', '10-115frame.png', '10-125frame.png', '10-75frame.png', '10-85frame.png', '10-95frame.png', '2-110frame.png', '2-55frame.png', '2-65frame.png', '2-90frame.png', '41-240frame.png', '41-255frame.png', '41-270frame.png', '41-305frame.png']

可以发现在这个列表里相对有序了,但距离想要的顺序还很远,值得注意的是,这里导入的文件名是带后缀的(.png)。

sort()的排序会优先排1,就算是10也会排在2的前面。这当然不是我们想要的。

此时要使用正则表达(具体我不太清楚是不是这个名字了)去排序,方法如下。

images.sort(key=lambda x:(int(x.split('-')[0])))
print(images)

此公式的意思是,将列表中的所有文件名以"-“为基准进行分割(split),那么此时文件名就分为两个部分,”-“前([0])和”-“后([1]),现在的排序顺序是”-"前的,所以前面排好了。

['1-70frame.png', '1-55frame.png', '1-110frame.png', '1-40frame.png', '2-55frame.png', '2-110frame.png', '2-90frame.png', '2-65frame.png', '10-95frame.png', '10-85frame.png', '10-125frame.png', '10-115frame.png', '10-75frame.png', '10-105frame.png', '41-255frame.png', '41-270frame.png', '41-305frame.png', '41-240frame.png']

此时可以发现"-"前面的序号已经排好了,即1、2、10、41的顺序,但后面的顺序不是我们想要的。此时我们需要用两次正则,也很简单,操作如下:

images.sort(key=lambda x:(int(x.split('-')[0]),int(x.split('frame.png')[0].split('-')[1])))

加入",“说明,先以前面排序,然后以后面排序。以文件名"1-40frame.png"为例,第一次基于”-“分割后变成了[“1”,“40frame.png”],以0位置也就是"1"处排序。第二次基于"frame.png"分割后变成了[“1-40”],再基于”-"分割后变成了[“1”,“40”],这样对1位置也就是"40"处排序即可。总结来讲就是先对前面排序再对后面排序。

效果为

['1-40frame.png', '1-55frame.png', '1-70frame.png', '1-110frame.png', '2-55frame.png', '2-65frame.png', '2-90frame.png', '2-110frame.png', '10-75frame.png', '10-85frame.png', '10-95frame.png', '10-105frame.png', '10-115frame.png', '10-125frame.png', '41-240frame.png', '41-255frame.png', '41-270frame.png', '41-305frame.png']

聪明的小伙伴会发现分割的方式不只有一种,但完成的效果是相同的。

2.通过glob导入

后续再写

猜你喜欢

转载自blog.csdn.net/xiufan1/article/details/129874481