Saya telah menulis kode Python berikut:
#!/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
Sekarang saya mengerti:
/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
Di mana cara memesannya?
Mungkin membantu Anda untuk mendapatkan ls -l output saya:
-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
Ini tidak dipesan berdasarkan nama file atau ukuran.
ls
perintah itu sendiri mengurutkan file dengan nama. 'ls -U' memberikan daftar file yang tidak terurut dalam "urutan direktori".os.listdir
: * nix OS mengembalikan file dalam urutan yang tidak sesuai abjad, dan (memalukan saya untuk terkejut!) Ini secara eksplisit dalam dokumentasi : "Daftar ini dalam urutan acak".Jawaban:
Mungkin tidak diurutkan sama sekali dan menggunakan urutan entri muncul di sistem file, yaitu yang Anda dapatkan saat menggunakan
ls -U
. (Setidaknya pada mesin saya ini menghasilkan urutan yang sama dengan daftarglob
pencocokan).sumber
Pesanan sewenang-wenang, tetapi Anda dapat mengurutkannya sendiri
Jika Anda ingin disortir berdasarkan nama:
diurutkan berdasarkan waktu modifikasi:
diurutkan berdasarkan ukuran:
dll.
sumber
files = glob.glob('teksty/*')
. Akankah pesanan dengan nam diberikan?Dengan memeriksa kode sumber
glob.glob
Anda melihat bahwa itu panggilan internalos.listdir
, dijelaskan di sini:http://docs.python.org/library/os.html?highlight=os.listdir#os.listdir
Kalimat kunci: os.listdir (path) Mengembalikan daftar yang berisi nama-nama entri dalam direktori yang diberikan oleh path. Daftar ini dalam urutan acak. Itu tidak termasuk entri khusus '.' dan '..' bahkan jika mereka ada di direktori.
Pesanan sewenang-wenang . :)
sumber
glob.glob () adalah pembungkus di sekitar os.listdir () sehingga OS yang mendasari bertanggung jawab untuk mengirimkan data. Secara umum: Anda tidak dapat membuat asumsi tentang pemesanan di sini. Asumsi dasarnya adalah: tidak ada pemesanan. Jika Anda memerlukan penyortiran: sortir pada level aplikasi.
sumber
Pesanan sewenang-wenang, tetapi ada beberapa cara untuk mengurutkannya. Salah satunya adalah sebagai berikut:
sumber
natsort
:from natsort import natsorted; files = natsorted(files)
.Saya memiliki masalah yang sama,
glob
mengembalikan daftar nama file dalam urutan acak tetapi saya ingin melangkah melalui urutan numerik seperti yang ditunjukkan oleh nama file. Beginilah cara saya mencapainya:File saya dikembalikan oleh
glob
sesuatu seperti:Saya mengurutkan daftar di tempat, untuk melakukan ini saya membuat fungsi:
Fungsi ini mengembalikan bagian numerik dari nama file dan mengkonversi ke integer. Saya kemudian memanggil metode sortir dalam daftar sebagai berikut:
Ini mengembalikan daftar sebagai berikut:
sumber
os.path.splitext(os.path.basename(s))[0]
daripadaos.path.basename(s)[:-4]
, jadi definisi fungsi akan menjadi.def sortKeyFunc(s): return int(os.path.splitext(os.path.basename(s))[0])
Jika Anda bertanya-tanya tentang apa yang dilakukan glob.glob pada sistem Anda di masa lalu dan tidak dapat menambahkan
sorted
panggilan, pemesanan akan konsisten pada sistem file Mac HFS + dan akan menjadi urutan traversal pada sistem Unix lainnya. Jadi kemungkinan besar akan menjadi deterministik kecuali sistem file yang mendasarinya ditata ulang yang dapat terjadi jika file ditambahkan, dihapus, diganti nama, dihapus, dipindahkan, dll ...sumber
Dari solusi @Johan La Rooy, memilah gambar menggunakan
sorted(glob.glob('*.png'))
tidak berfungsi untuk saya, daftar output masih tidak diurutkan dengan nama mereka.Namun,
sorted(glob.glob('*.png'), key=os.path.getmtime)
kerjanya dengan sempurna.Saya agak bingung bagaimana bisa menyortir berdasarkan nama mereka tidak berfungsi di sini.
Terima kasih @Martin Thoma karena memposting pertanyaan hebat ini dan @Johan La Rooy untuk solusi yang bermanfaat.
sumber
Silakan coba kode ini:
sumber
Begitulah cara saya melakukan kasus khusus saya. Semoga bermanfaat.
sumber