Python中,os.listdir遍历纯数字文件乱序如何解决
Python中,os.listdir遍历纯数字文件乱序如何解决
日常跑深度学习视觉相关代码时,常常需要对数据集进行处理。许多图像文件名是利用纯数字递增的方式命名。通常所用的排序函数sort(),是按照string进行比较的。例如原始的目录下的文件是:
1.jpg
12.jpg
19.jpg
120.jpg
190.jpg
但经过os.listdir()后的顺序就变为:
1.jpg
12.jpg
120.jpg
19.jpg
190.jpg
解决这个问题,首先看python中sort()函数的具体用法,分别看python2.x和python3.x中的sorted()和sort()函数:
- python2.x
>>>help(list.sort)
Help on method_descriptor:
sort(...)
L.sort(cmp=None, key=None, reverse=False) -- stable sort IN PLACE;
cmp(x, y) -> -1, 0, 1
>>>help(sorted)
Help on built-in function sorted in module builtin:
sorted(...)
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
- python3.x
>>>help(list.sort)
Help on method_descriptor:
sort(...)
L.sort(key=None, reverse=False) -> None -- stable sort IN PLACE
>>>help(sorted)
Help on built-in function sorted in module builtins:
sorted(iterable, key=None, reverse=False)
Return a new list containing all items from the iterable in ascending order.A custom key function can be supplied to customise the sort order, and the reverse flag can be set to request the result in descending order.
(1)由以上可知python2.x与python3.x的区别仅在于参数cmp,python3.x中取消了对cmp的支持。Python3.x直接忽略cmp这个参数即可,为了保证代码通用性,不建议在今后的编程中使用cmp参数。
(2)sort()和sorted()的区别在于sort函数是list列表中的函数,而sorted可以对list或者iterator进行排序。sorted返回的是一个新的排序对象,而sort则是在原对象上进行排序。
基于以上,可以利用python3.x中的sort(key=None, reverse=False)函数来解决上述问题,首先进行参数说明:
key表示一个带参数的函数;
reverse表示是否反序
另外,python2.x的sorted函数中的两个参数表示:
iterable表示list或iterator;
cmp表示带两个参数的比较函数。
通过lambda expression解决,代码如下:
file = os.listdir(path)
file.sort()
file.sort(key = lambda x: int(x[:-4]))
此处x表示参数,x[:-4]则表示只取文件名进行排序,去掉拓展名,此处拓展名是3个字符。可以根据具体的实际情况进行修改。