J'ai écrit le code Python suivant:
#!/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
Maintenant, je reçois ceci:
/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
De quelle manière est-il ordonné?
Cela pourrait vous aider à obtenir ma sortie 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
Il n'est pas trié par nom de fichier ou par taille.
ls
commande elle-même trie les fichiers par nom. 'ls -U' donne une liste non ordonnée de fichiers dans "l'ordre du répertoire".os.listdir
: * nix OS renvoie les fichiers dans un ordre assez non alphabétique, et (honte à moi d'être surpris!) C'est explicite dans la documentation : "La liste est dans un ordre arbitraire".Réponses:
Il n'est probablement pas trié du tout et utilise l'ordre dans lequel les entrées apparaissent dans le système de fichiers, c'est-à-dire celui que vous obtenez lors de l'utilisation
ls -U
. (Au moins sur ma machine, cela produit le même ordre que la liste desglob
correspondances).la source
L'ordre est arbitraire, mais vous pouvez les trier vous-même
Si vous souhaitez trier par nom:
trié par heure de modification:
trié par taille:
etc.
la source
files = glob.glob('teksty/*')
. La commande par nom sera-t-elle accordée?En vérifiant le code source de
glob.glob
vous voyez qu'il appelle en interneos.listdir
, décrit ici:http://docs.python.org/library/os.html?highlight=os.listdir#os.listdir
Phrase clé: os.listdir (chemin) Renvoie une liste contenant les noms des entrées du répertoire donnés par chemin. La liste est dans un ordre arbitraire. Il n'inclut pas les entrées spéciales "." et '..' même s'ils sont présents dans le répertoire.
Ordre arbitraire . :)
la source
glob.glob () est un wrapper autour de os.listdir () donc le système d'exploitation sous-jacent est responsable de la livraison des données. En général: vous ne pouvez pas faire d'hypothèse sur la commande ici. L'hypothèse de base est: pas de commande. Si vous avez besoin d'un tri: triez au niveau de l'application.
la source
L'ordre est arbitraire, mais il existe plusieurs façons de les trier. L'un d'eux est le suivant:
la source
natsort
:from natsort import natsorted; files = natsorted(files)
.J'ai eu un problème similaire, je
glob
renvoyais une liste de noms de fichiers dans un ordre arbitraire mais je voulais les parcourir dans l'ordre numérique indiqué par le nom du fichier. Voici comment je l'ai réalisé:Mes fichiers ont été retournés par
glob
quelque chose comme:J'ai trié la liste en place, pour ce faire j'ai créé une fonction:
Cette fonction renvoie la partie numérique du nom de fichier et convertit en un entier. J'ai ensuite appelé la méthode de tri sur la liste en tant que telle:
Cela a renvoyé une liste en tant que telle:
la source
os.path.splitext(os.path.basename(s))[0]
au lieu deos.path.basename(s)[:-4]
, donc la définition de la fonction sera.def sortKeyFunc(s): return int(os.path.splitext(os.path.basename(s))[0])
Si vous vous demandez ce que glob.glob a fait sur votre système dans le passé et ne pouvez pas ajouter d'
sorted
appel, l'ordre sera cohérent sur les systèmes de fichiers Mac HFS + et sera l' ordre de traversée sur les autres systèmes Unix. Il aura donc probablement été déterministe à moins que le système de fichiers sous-jacent n'ait été réorganisé, ce qui peut se produire si des fichiers ont été ajoutés, supprimés, renommés, supprimés, déplacés, etc.la source
De la solution de @Johan La Rooy, le tri des images à l'aide
sorted(glob.glob('*.png'))
ne fonctionne pas pour moi, la liste de sortie n'est toujours pas classée par leurs noms.Cependant, cela
sorted(glob.glob('*.png'), key=os.path.getmtime)
fonctionne parfaitement.Je suis un peu confus comment le tri par leurs noms ne fonctionne pas ici.
Merci à @Martin Thoma d'avoir publié cette excellente question et à @Johan La Rooy pour les solutions utiles.
la source
Veuillez essayer ce code:
la source
C'est comme ça que j'ai fait mon cas particulier. J'espère que c'est utile.
la source