我已经编写了以下Python代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os, glob

path = '/home/my/path'
for infile in glob.glob( os.path.join(path, '*.png') ):
    print infile

现在我得到了这个:

/home/my/path/output0352.png
/home/my/path/output0005.png
/home/my/path/output0137.png
/home/my/path/output0202.png
/home/my/path/output0023.png
/home/my/path/output0048.png
/home/my/path/output0069.png
/home/my/path/output0246.png
/home/my/path/output0071.png
/home/my/path/output0402.png
/home/my/path/output0230.png
/home/my/path/output0182.png
/home/my/path/output0121.png
/home/my/path/output0104.png
/home/my/path/output0219.png
/home/my/path/output0226.png
/home/my/path/output0215.png
/home/my/path/output0266.png
/home/my/path/output0347.png
/home/my/path/output0295.png
/home/my/path/output0131.png
/home/my/path/output0208.png
/home/my/path/output0194.png

它是如何排列的?

澄清一下:我对排序不感兴趣——我知道排序。我想知道它默认出现的顺序。

它可能会帮助你得到我的ls -l输出:

-rw-r--r-- 1 moose moose 627669 2011-07-17 17:26 output0005.png
-rw-r--r-- 1 moose moose 596417 2011-07-17 17:26 output0023.png
-rw-r--r-- 1 moose moose 543639 2011-07-17 17:26 output0048.png
-rw-r--r-- 1 moose moose 535384 2011-07-17 17:27 output0069.png
-rw-r--r-- 1 moose moose 543216 2011-07-17 17:27 output0071.png
-rw-r--r-- 1 moose moose 561776 2011-07-17 17:27 output0104.png
-rw-r--r-- 1 moose moose 501865 2011-07-17 17:27 output0121.png
-rw-r--r-- 1 moose moose 547144 2011-07-17 17:27 output0131.png
-rw-r--r-- 1 moose moose 530596 2011-07-17 17:27 output0137.png
-rw-r--r-- 1 moose moose 532567 2011-07-17 17:27 output0182.png
-rw-r--r-- 1 moose moose 553562 2011-07-17 17:27 output0194.png
-rw-r--r-- 1 moose moose 574065 2011-07-17 17:27 output0202.png
-rw-r--r-- 1 moose moose 552197 2011-07-17 17:27 output0208.png
-rw-r--r-- 1 moose moose 559809 2011-07-17 17:27 output0215.png
-rw-r--r-- 1 moose moose 549046 2011-07-17 17:27 output0219.png
-rw-r--r-- 1 moose moose 566661 2011-07-17 17:27 output0226.png
-rw-r--r-- 1 moose moose 561678 2011-07-17 17:27 output0246.png
-rw-r--r-- 1 moose moose 525550 2011-07-17 17:27 output0266.png
-rw-r--r-- 1 moose moose 565715 2011-07-17 17:27 output0295.png
-rw-r--r-- 1 moose moose 568381 2011-07-17 17:28 output0347.png
-rw-r--r-- 1 moose moose 532768 2011-07-17 17:28 output0352.png
-rw-r--r-- 1 moose moose 535818 2011-07-17 17:28 output0402.png

它不是按文件名或大小排序的。

其他链接:glob, ls


当前回答

我有一个类似的问题,glob返回一个任意顺序的文件名列表,但我想通过它们的数字顺序,如文件名所示。我是这样做到的:

我的文件被glob返回,类似于:

myList = ["c:\tmp\x\123.csv", "c:\tmp\x\44.csv", "c:\tmp\x\101.csv", "c:\tmp\x\102.csv", "c:\tmp\x\12.csv"]

我对列表进行排序,为此我创建了一个函数:

def sortKeyFunc(s):
    return int(os.path.basename(s)[:-4])

此函数返回文件名的数字部分并转换为整数。然后我在列表上调用sort方法:

myList.sort(key=sortKeyFunc)

返回一个列表,如下所示:

["c:\tmp\x\12.csv", "c:\tmp\x\44.csv", "c:\tmp\x\101.csv", "c:\tmp\x\102.csv", "c:\tmp\x\123.csv"]

其他回答

glob.glob()是OS .listdir()的包装器,因此底层操作系统负责传递数据。一般来说,你不能对顺序做假设。基本假设是:没有排序。如果需要排序,请在应用程序级别进行排序。

它可能根本没有排序,而是使用文件系统中条目出现的顺序,即使用ls -U时得到的顺序。(至少在我的机器上,这会产生与列出glob匹配相同的顺序)。

我使用内置排序来解决这个问题:

from pathlib import Path

p = Path('/home/my/path')
sorted(list(p.glob('**/*.png')))

至少在Python3中你也可以这样做:

import os, re, glob

path = '/home/my/path'
files = glob.glob(os.path.join(path, '*.png'))
files.sort(key=lambda x:[int(c) if c.isdigit() else c for c in re.split(r'(\d+)', x)])
for infile in files:
    print(infile)

这应该按字典顺序排列您的输入字符串数组(例如,在排序时尊重字符串中的数字)。

从@Johan La Rooy的解决方案中,使用sorted(glob.glob('*.png'))对图像进行排序对我来说不起作用,输出列表仍然没有按它们的名称排序。

然而,sorted(glob.glob('*.png'), key=os.path.getmtime)工作得很好。

我有点困惑,为什么按他们的名字排序在这里行不通。

感谢@Martin Thoma提出了这个好问题,感谢@Johan La Rooy提供了有用的解决方案。