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"处排序即可。总结来讲就是先对前面排序再对后面排序。
效果为
扫描二维码关注公众号,回复:
15951098 查看本文章
['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导入
后续再写