Napisałem następujący kod 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
Teraz rozumiem:
/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
W jaki sposób jest zamówiony?
Może ci pomóc uzyskać mój wynik 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
Nie jest uporządkowane według nazwy pliku ani rozmiaru.
ls
samo polecenie sortuje pliki według nazw. „ls -U” daje nieuporządkowaną listę plików w „kolejności katalogów”.os.listdir
: * nix OS zwraca pliki w całkiem nie alfabetycznej kolejności, i (wstyd mnie, żebym się zdziwił!) Jest to wyraźnie zaznaczone w dokumentacji : „Lista jest w dowolnej kolejności”.Odpowiedzi:
Prawdopodobnie nie jest w ogóle posortowany i używa kolejności, w jakiej wpisy pojawiają się w systemie plików, tj. Tej, którą otrzymujesz podczas używania
ls -U
. (Przynajmniej na moim komputerze powoduje to taką samą kolejność, jakglob
dopasowanie do listy ).źródło
Porządek jest dowolny, ale możesz je posortować samodzielnie
Jeśli chcesz posortować według nazwy:
posortowane według czasu modyfikacji:
posortowane według rozmiaru:
itp.
źródło
files = glob.glob('teksty/*')
. Czy zamówienie zostanie wydane przez nam?Sprawdzając kod źródłowy
glob.glob
, widzisz, że wywołuje wewnętrznieos.listdir
, opisane tutaj:http://docs.python.org/library/os.html?highlight=os.listdir#os.listdir
Zdanie kluczowe: os.listdir (ścieżka) Zwraca listę zawierającą nazwy wpisów w katalogu podanych przez ścieżkę. Lista jest w dowolnej kolejności. Nie obejmuje wpisów specjalnych „”. i „..”, nawet jeśli są obecne w katalogu.
Arbitralny porządek . :)
źródło
glob.glob () jest opakowaniem wokół os.listdir (), więc podkładanie systemu operacyjnego jest odpowiedzialne za dostarczanie danych. Ogólnie: tutaj nie można zakładać zamówienia. Podstawowym założeniem jest: brak zamawiania. Jeśli potrzebujesz sortowania: sortuj na poziomie aplikacji.
źródło
Porządek jest arbitralny, ale istnieje kilka sposobów ich sortowania. Jednym z nich jest:
źródło
natsort
:from natsort import natsorted; files = natsorted(files)
.Miałem podobny problem,
glob
zwracałem listę nazw plików w dowolnej kolejności, ale chciałem je przeglądać w kolejności numerycznej, jak wskazuje nazwa pliku. Oto jak to osiągnąłem:Moje pliki zostały zwrócone przez
glob
coś takiego:Posortowałem listę w miejscu, aby to zrobić, stworzyłem funkcję:
Ta funkcja zwraca część numeryczną nazwy pliku i konwertuje na liczbę całkowitą. Następnie wywołałem metodę sortowania na liście jako taką:
To zwróciło listę jako taką:
źródło
os.path.splitext(os.path.basename(s))[0]
zamiastos.path.basename(s)[:-4]
, więc definicja funkcji będzie.def sortKeyFunc(s): return int(os.path.splitext(os.path.basename(s))[0])
Jeśli zastanawiasz się, co glob.glob zrobił w twoim systemie w przeszłości i nie możesz dodać
sorted
połączenia, kolejność będzie spójna w systemach plików Mac HFS + i będzie kolejnością przechodzenia przez inne systemy uniksowe. Prawdopodobnie byłby deterministyczny, chyba że bazowy system plików został zreorganizowany, co może się zdarzyć, jeśli pliki zostaną dodane, usunięte, przemianowane, usunięte, przeniesione itp.źródło
Według rozwiązania @Johan La Rooy sortowanie obrazów za pomocą
sorted(glob.glob('*.png'))
nie działa dla mnie, lista wyników wciąż nie jest uporządkowana według ich nazw.Jednak
sorted(glob.glob('*.png'), key=os.path.getmtime)
działa idealnie.Jestem trochę zdezorientowany, jak sortowanie według ich nazw nie działa tutaj.
Dziękuję @Martin Thoma za opublikowanie tego wspaniałego pytania i @Johan La Rooy za pomocne rozwiązania.
źródło
Spróbuj tego kodu:
źródło
Tak właśnie zrobiłem mój konkretny przypadek. Mam nadzieję, że to jest pomocne.
źródło