Pythons global.glob được đặt hàng như thế nào?


199

Tôi đã viết mã Python sau:

#!/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

Bây giờ tôi nhận được điều này:

/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

Nó được đặt theo cách nào?

Nó có thể giúp bạn có được đầu ra ls -l của tôi:

-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

Nó không được sắp xếp theo tên tệp hoặc kích thước.

Các liên kết khác : glob,ls


2
Câu trả lời cuối cùng dường như là lschính lệnh sắp xếp các tệp theo tên. 'ls -U' đưa ra danh sách các tệp không theo thứ tự trong "thứ tự thư mục".
Brian Peterson

2
Trên các cửa sổ, nó đã được sắp xếp, vì vậy tôi chỉ cho rằng nó luôn như vậy .. bây giờ trên Ubuntu, tôi phải trả phí để gỡ lỗi. Lưu ý để tự đọc api! : 0)
Yuri Feldman

Hành vi tương tự với os.listdir: * nix OS trả về các tệp theo thứ tự không theo thứ tự chữ cái và (thật xấu hổ khi tôi bị bất ngờ!) Điều này được nêu rõ trong tài liệu : "Danh sách theo thứ tự tùy ý".
Joël

Câu trả lời:


112

Nó có thể hoàn toàn không được sắp xếp và sử dụng thứ tự xuất hiện các mục trong hệ thống tập tin, tức là mục bạn nhận được khi sử dụng ls -U. (Ít nhất trên máy của tôi, cái này tạo ra thứ tự giống như danh sách globkhớp).


1
Có, trừ khi nó thực hiện một nỗ lực đặc biệt, nó sẽ chỉ hiển thị các mục khi hệ điều hành cung cấp. Giống như lệnh "find" trong Unix, nó chỉ loại bỏ các mục theo thứ tự chúng đến từ cấu trúc dữ liệu được sử dụng bởi hệ thống tệp bên dưới. Bạn không nên đưa ra bất kỳ giả định nào về thứ tự của nó, ngay cả khi bạn sẽ thấy các tệp dường như xuất hiện theo thứ tự tạo.
Raúl Salinas-Monteagudo

421

Đặt hàng là tùy ý, nhưng bạn có thể tự sắp xếp chúng

Nếu bạn muốn sắp xếp theo tên:

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

sắp xếp theo thời gian sửa đổi:

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

sắp xếp theo kích thước:

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

Vân vân.


1
Tôi có các tệp, trong đó tên chỉ là số nguyên, không có phần mở rộng, vì vậy tôi sử dụng : files = glob.glob('teksty/*'). Sẽ là thứ tự của nam cấp?
andilabs

3
@mgaches Không, đó không phải là câu hỏi tôi thực sự muốn hỏi. Những gì tôi muốn biết đã được trả lời bởi Xion.
Martin Thoma

Và những gì về sắp xếp nó theo ngày tạo nhưng theo thời gian tạo. Bởi vì nó liệt kê cho tôi những tập tin mới nhất. Làm thế nào tôi có thể nhận được một danh sách từ các tập tin cũ đến mới nhất? Cảm ơn bạn!
joaquindev

1
Lưu ý rằng getmtime và getize tương đối đắt tiền - thực hiện việc này trong nhiều tệp có thể mất một lúc ..
drevicko

53

Bằng cách kiểm tra mã nguồn của glob.globbạn thấy rằng nó gọi nội bộ os.listdir, được mô tả ở đây:

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

Câu chính: os.listdir (đường dẫn) Trả về danh sách chứa tên của các mục trong thư mục được cung cấp bởi đường dẫn. Danh sách theo thứ tự tùy ý. Nó không bao gồm các mục đặc biệt '.' và '..' ngay cả khi chúng có trong thư mục.

Trật tự tùy ý . :)


14

global.glob () là một trình bao bọc xung quanh os.listdir () vì vậy HĐH lót có trách nhiệm cung cấp dữ liệu. Nói chung: bạn không thể đưa ra một giả định về việc đặt hàng ở đây. Giả định cơ bản là: không đặt hàng. Nếu bạn cần một số sắp xếp: sắp xếp theo cấp độ ứng dụng.


13

Thứ tự là tùy ý, nhưng có một số cách để sắp xếp chúng. Một trong số đó là như sau:

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

Câu trả lời của bạn đóng góp gì so với các câu trả lời hiện có?
Martin Thoma

2
@MartinThoma Tôi gặp vấn đề với việc sắp xếp không sắp xếp tên tệp nếu số nguyên có trong tệp không được đệm. Việc sắp xếp bắt đầu từ 1000, đi lên cho dù số nguyên cao nhất là bao nhiêu và sau đó bắt đầu lại từ số nguyên nhỏ nhất. Nếu tôi không đệm các số, chỉ cần gọi sắp xếp trên các tệp sắp xếp chúng một cách hoàn hảo. Vì vậy, tôi nghĩ rằng giải pháp này giải quyết vấn đề khi được sắp xếp một mình không hoạt động.
Will.Evo

1
@ Will.Evo Hãy thử sử dụng natsort: from natsort import natsorted; files = natsorted(files).
Martin Thoma

Câu trả lời của bạn đã giúp!
Vine

12

Tôi có một vấn đề tương tự, globlà trả về một danh sách các tên tệp theo thứ tự tùy ý nhưng tôi muốn bước qua chúng theo thứ tự số như được chỉ định bởi tên tệp. Đây là cách tôi đạt được nó:

Các tập tin của tôi đã được trả về bởi globmột cái gì đó như:

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

Tôi đã sắp xếp danh sách tại chỗ, để làm điều này tôi đã tạo một hàm:

def sortKeyFunc(s):
    return int(os.path.basename(s)[:-4])

Hàm này trả về phần số của tên tệp và chuyển đổi thành một số nguyên. Sau đó, tôi gọi phương thức sắp xếp trong danh sách như sau:

myList.sort(key=sortKeyFunc)

Điều này trả về một danh sách như vậy:

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

Tôi nghĩ rằng nó là thanh lịch hơn để sử dụng os.path.splitext(os.path.basename(s))[0]thay vì os.path.basename(s)[:-4], vì vậy định nghĩa chức năng sẽ được. def sortKeyFunc(s): return int(os.path.splitext(os.path.basename(s))[0])
ePandit

1

Nếu bạn đang tự hỏi về những gì global.glob đã làm trên hệ thống của bạn trong quá khứ và không thể thêm một sortedcuộc gọi, thứ tự sẽ nhất quán trên các hệ thống tệp Mac HFS + và sẽ theo thứ tự trên các hệ thống Unix khác. Vì vậy, nó có thể sẽ có tính xác định trừ khi hệ thống tệp cơ bản được tổ chức lại có thể xảy ra nếu các tệp được thêm, xóa, đổi tên, xóa, di chuyển, v.v ...


Còn APFS trên macOS thì sao?
Boris

0

Từ giải pháp của @Johan La Rooy, việc sắp xếp các hình ảnh sử dụng sorted(glob.glob('*.png'))không hiệu quả với tôi, danh sách đầu ra vẫn không được sắp xếp theo tên của chúng.

Tuy nhiên, các sorted(glob.glob('*.png'), key=os.path.getmtime)công trình hoàn hảo.

Tôi hơi bối rối làm thế nào để sắp xếp theo tên của họ không hoạt động ở đây.

Cảm ơn @Martin Thoma đã đăng câu hỏi tuyệt vời này và @Johan La Rooy vì những giải pháp hữu ích.


-1

Vui lòng thử mã này:

sorted(glob.glob( os.path.join(path, '*.png') ),key=lambda x:float(re.findall("([0-9]+?)\.png",x)[0]))

-3
'''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])

Đó là cách tôi đã làm trường hợp cụ thể của tôi. Hy vọng nó hữu ích.


1
Bạn nên thay đổi câu trả lời của bạn để phù hợp với câu hỏi.
CodenameLambda

1
Câu hỏi không phải là về sắp xếp. Tôi biết (và tôi biết sau đó) làm thế nào để sắp xếp. Câu hỏi là về thứ tự mặc định.
Martin Thoma

1
Cảm ơn bạn vì đoạn mã này, có thể cung cấp một số trợ giúp ngay lập tức. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị giáo dục của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những độc giả tương lai với những câu hỏi tương tự, nhưng không giống nhau. Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích và đưa ra dấu hiệu về những hạn chế và giả định được áp dụng.
Toby Speight
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.