zoukankan      html  css  js  c++  java
  • 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个字符。可以根据具体的实际情况进行修改。

  • 相关阅读:
    MongoCola使用教程 1 MongoDB的基本操作和聚合功能
    [教程]MongoDB 从入门到进阶 (TextSearch)
    MongoCola使用教程 2 MongoDB的Replset 初始化和配置
    [教程]MongoDB 从入门到进阶 (aggregation数据库状态)
    [教程]MongoDB 从入门到进阶 (概要 以及 高级索引篇 TimeToLive GeoNear)
    C#多线程函数如何传参数和返回值
    QQ邮箱 C# 发邮件 常见错误异常
    关于c#中的Timer控件的简单用法
    要想使用线程 想去方法 应该传入object 传参
    quartz给任务传参数以及维持任务的状态
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/9492228.html
Copyright © 2011-2022 走看看