如何命令Pythons glob.glob?

Mar*_*oma 170 python

我编写了以下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
Run Code Online (Sandbox Code Playgroud)

现在我明白了:

/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
Run Code Online (Sandbox Code Playgroud)

它以哪种方式订购?

它可能会帮助你获得我的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
Run Code Online (Sandbox Code Playgroud)

它不按文件名或大小排序.

相关链接:glob,ls

Joh*_*ooy 367

订单是任意的,但您可以自己对它们进行排序

如果您想按名称排序:

sorted(glob.glob('*.png'))
Run Code Online (Sandbox Code Playgroud)

按修改时间排序:

import os
sorted(glob.glob('*.png'), key=os.path.getmtime)
Run Code Online (Sandbox Code Playgroud)

按大小排序:

import os
sorted(glob.glob('*.png'), key=os.path.getsize)
Run Code Online (Sandbox Code Playgroud)

等等

  • @mgalgs不,这不是我真正要问的问题.Xion回答了我想知道的事情. (3认同)
  • 我有文件,其中名称只是整数,没有扩展名,所以我使用:`files = glob.glob('teksty/*')`。nam 的命令会被批准吗? (2认同)
  • 请注意, getmtime 和 getsize 相对昂贵 - 对大量文件执行此操作可能需要一段时间。 (2认同)

Xio*_*ion 97

它可能不是在所有排序,并使用在哪些条目出现在文件系统中的顺序,即你使用时,你得到一个ls -U.(至少在我的机器上,这产生与列表glob匹配相同的顺序).

  • 是的,除非它特别努力,否则它只会显示操作系统提供的条目。与 Unix 中的命令“find”相同,它只是按照条目来自底层文件系统使用的数据结构的顺序转储条目。您不应对其排序做出任何假设,即使您会看到文件似乎是按创建顺序出现的。 (2认同)

Ray*_*oal 48

通过检查您的源代码,glob.glob看到它内部调用os.listdir,如下所述:

http://docs.python.org/library/os.html?highlight=os.listdir#os.listdir

关键句:os.listdir(path)返回包含由路径给出的目录中的条目名称的列表.该列表按任意顺序排列.它不包括特殊条目'.' 和'..'即使它们存在于目录中.

任意顺序.:)


小智 13

glob.glob()是围绕os.listdir一个包装(),因此垫层OS负责用于递送数据.一般来说:你不能在这里订购假设.基本假设是:没有排序.如果您需要一些排序:在应用程序级别排序.


小智 10

至少在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)
Run Code Online (Sandbox Code Playgroud)

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


小智 9

我有一个类似的问题,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"]
Run Code Online (Sandbox Code Playgroud)

我将列表排序到位,为此我创建了一个函数:

def sortKeyFunc(s):
    return int(os.path.basename(s)[:-4])
Run Code Online (Sandbox Code Playgroud)

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

myList.sort(key=sortKeyFunc)
Run Code Online (Sandbox Code Playgroud)

这样返回一个列表:

["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"]
Run Code Online (Sandbox Code Playgroud)

  • 我认为使用 os.path.splitext(os.path.basename(s))[0]` 而不是 os.path.basename(s)[:-4]` 更优雅,所以函数定义将。`def sortKeyFunc(s): return int(os.path.splitext(os.path.basename(s))[0])` (2认同)

小智 6

顺序是任意的,但是有几种方法可以对它们进行排序。其中之一如下:

#First, get the files:
import glob
import re
files =glob.glob1(img_folder,'*'+output_image_format)
# if you want sort files according to the digits included in the filename, you can do as following:
files = sorted(files, key=lambda x:float(re.findall("(\d+)",x)[0]))
Run Code Online (Sandbox Code Playgroud)

  • @Will.Evo 尝试使用 [`natsort`](https://pypi.org/project/natsort/): `from natsort import natsorted; 文件= natsorted(文件)`。 (3认同)
  • @MartinThoma 我有一个问题,如果文件中存在的整数不是零填充,则排序不会对文件名进行排序。排序从 1000 开始,一直到最大整数,然后从最小整数开始重新排序。如果我对数字进行零填充,只需对文件调用排序即可完美地对它们进行排序。所以我认为这个解决方案解决了单独排序不起作用时的问题。 (2认同)

小智 6

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

然而,sorted(glob.glob('*.png'), key=os.path.getmtime)工作完美。

我有点困惑,怎么按他们的名字排序在这里不起作用。

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

  • 我认为字母顺序更适合此解决方案,因为文件日期在 Linux 上可能会有所不同。所以如果文件名中使用了顺序号(位数相同),也可以使用字母顺序:`sorted(glob.glob('*.png'), key=os.path.basename )` (2认同)

Hug*_*ugo 6

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

from pathlib import Path

p = Path('/home/my/path')
sorted(list(p.glob('**/*.png')))
Run Code Online (Sandbox Code Playgroud)