如何命令Pythons glob.glob?

时间:2011-07-21 08:59:22

标签: 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

现在我明白了:

/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

不按文件名或大小排序。

其他链接:globls

13 个答案:

答案 0 :(得分:316)

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

如果您想按名称排序:

sorted(glob.glob('*.png'))

按修改时间排序:

import os
sorted(glob.glob('*.png'), key=os.path.getmtime)

按大小排序:

import os
sorted(glob.glob('*.png'), key=os.path.getsize)

答案 1 :(得分:87)

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

答案 2 :(得分:45)

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

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

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

任意订单。 :)

答案 3 :(得分:11)

glob.glob()是os.listdir()的包装器,因此底层操作系统负责传递数据。一般来说:你不能在这里订购假设。基本假设是: no 排序。如果您需要一些排序:在应用程序级别排序。

答案 4 :(得分: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"]

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

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"]

答案 5 :(得分:2)

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

#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]))

答案 6 :(得分:2)

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

不过,sorted(glob.glob('*.png'), key=os.path.getmtime)的运行效果很好。

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

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

答案 7 :(得分:1)

至少在 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)

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

答案 8 :(得分:0)

如果您想知道glob.glob过去在系统上所做的事情而无法添加scanf调用,则排序在Mac HFS+ filesystems上将是一致的,并且将是{{3}在其他Unix系统上。因此,除非对底层文件系统进行了重组,否则可能是确定性的;如果添加,删除,重命名,删除,移动等文件,则可能会发生重组。

答案 9 :(得分:0)

我使用了内置的 sorted 来解决这个问题:

from pathlib import Path

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

答案 10 :(得分:-2)

请尝试以下代码:

['getDetailsfrmBean(', 'storePg', '564', 'Berwyn', 'IL', '7180', 'W', 'CERMAK', 'RD.', 'SPACE', 'A1', 'BERWYN', 'IL', 'US', '60402', '(708)', '788', '5097', '{Monday', 'Saturday=10', '9', 'sunday=11', '6}', '41.8507029', '87.8033709', ');']

答案 11 :(得分:-2)

 from tkinter import Tcl    
import glob
lists=glob.glob('*.png'))
sorted_list=Tcl().call('lsort', '-dict', lists)

您可以使用 tkinter 按“文件名文本中的整数”对读取的文件进行排序

答案 12 :(得分:-4)

'''my file name is 
"0_male_0.wav", "0_male_2.wav"... "0_male_30.wav"... 
"1_male_0.wav", "1_male_2.wav"... "1_male_30.wav"... 
"8_male_0.wav", "8_male_2.wav"... "8_male_30.wav"

when I wav.read(files) I want to read them in a sorted torder, i.e., "0_male_0.wav"
"0_male_1.wav"
"0_male_2.wav" ...
"0_male_30.wav"
"1_male_0.wav"
"1_male_1.wav"
"1_male_2.wav" ...
"1_male_30.wav"
so this is how I did it.

Just take all files start with "0_*" as an example. Others you can just put it in a loop
'''

import scipy.io.wavfile as wav
import glob 
from os.path import isfile, join

#get all the file names in file_names. THe order is totally messed up
file_names = [f for f in listdir(audio_folder_dir) if isfile(join(audio_folder_dir, f)) and '.wav' in f] 
#find files that belongs to "0_*" group
filegroup0 = glob.glob(audio_folder_dir+'/0_*')
#now you get sorted files in group '0_*' by the last number in the filename
filegroup0 = sorted(filegroup0, key=getKey)

def getKey(filename):
    file_text_name = os.path.splitext(os.path.basename(filename))  #you get the file's text name without extension
    file_last_num = os.path.basename(file_text_name[0]).split('_')  #you get three elements, the last one is the number. You want to sort it by this number
    return int(file_last_num[2])

这就是我如何处理我的具体案例。希望它有所帮助。