कैसे अजगर ग्लोब है।


200

मैंने निम्नलिखित पायथन कोड लिखा है:

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

यह फ़ाइल नाम या आकार के अनुसार नहीं है।

अन्य लिंक: glob,ls


2
अंतिम उत्तर यह प्रतीत होता है कि lsकमांड स्वयं फ़ाइलों को नाम से क्रमबद्ध करता है। 'ls -U' "डायरेक्टरी ऑर्डर" में फाइलों की एक अनियंत्रित सूची देता है।
ब्रायन पीटरसन

2
खिड़कियों पर यह सॉर्ट किया गया था इसलिए मैंने अभी यह मान लिया है कि यह हमेशा ऐसा है .. अब उबंटू पर यह मुझे डिबगिंग की लागत देता है। स्वयं पर ध्यान दें - एपी पढ़ें! : 0)
यूरी फेल्डमैन

इसके साथ व्यवहार समान है os.listdir: * निक्स ओएस काफी गैर-वर्णानुक्रम में फाइल लौटाता है, और (मुझे शर्म आनी चाहिए!) यह दस्तावेज में स्पष्ट है : "सूची मनमाने क्रम में है"।
जोएल

जवाबों:


112

यह शायद बिल्कुल भी सॉर्ट नहीं किया गया है और उस क्रम का उपयोग करता है जिस पर फाइलसिस्टम में प्रविष्टियां दिखाई देती हैं, अर्थात जो आपको उपयोग करते समय मिलती है ls -U। (कम से कम मेरी मशीन पर यह सूची globमिलान के समान क्रम का उत्पादन करता है )।


1
हां, जब तक यह एक विशेष प्रयास नहीं करता है, यह बस प्रविष्टियों को दिखाएगा क्योंकि ऑपरेटिंग सिस्टम इसे प्रदान करता है। यूनिक्स में कमांड "ढूंढ" के समान है, यह केवल उन प्रविष्टियों को डंप करता है जो वे अंतर्निहित फाइल सिस्टम द्वारा उपयोग किए गए डेटा संरचना से आते हैं। आपको इसके आदेश के बारे में कोई धारणा नहीं बनानी चाहिए, भले ही आप देखेंगे कि फाइलें सृजन क्रम में लगती हैं।
राउल सालिनास-मोंटेगुडो

423

आदेश मनमाना है, लेकिन आप उन्हें स्वयं सुलझा सकते हैं

यदि आप नाम से क्रमबद्ध करना चाहते हैं:

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
मेरे पास फाइलें हैं, जहां नाम केवल पूर्णांक हैं, बिना विस्तार के, इसलिए मैं उपयोग करता हूं files = glob.glob('teksty/*'):। क्या मेम द्वारा आदेश दिया जाएगा?
औरिलाबस

3
@ मंगल, नहीं, यह सवाल मैं वास्तव में पूछने का मतलब नहीं था। मैं जो जानना चाहता था उसका जवाब जिओन ने दिया था।
मार्टिन थोमा

और निर्माण तिथि के अनुसार इसे बनाने के बारे में क्या है लेकिन सृजन समय के अनुसार। क्योंकि यह मुझे पहली बार नई फाइलों को सूचीबद्ध कर रहा है। मैं पुरानी से नई फाइलों की सूची कैसे प्राप्त कर सकता हूं? धन्यवाद!
joaquindev

1
ध्यान दें कि getmtime और getize अपेक्षाकृत महंगे हैं - बहुत सारी फ़ाइलों के लिए ऐसा करने में कुछ समय लग सकता है ..
drevicko

53

glob.globआप के स्रोत कोड की जाँच करके देखें कि यह आंतरिक रूप से कॉल करता है os.listdir, यहाँ वर्णित है:

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

मुख्य वाक्य: os.listdir (पथ) एक सूची लौटाएं जिसमें पथ द्वारा दी गई निर्देशिका में प्रविष्टियों के नाम हों। सूची मनमाने क्रम में है। इसमें विशेष प्रविष्टियाँ शामिल नहीं हैं '।' और '..' भले ही वे डायरेक्टरी में मौजूद हों।

मनमाना आदेश । :)


14

glob.glob () os.listdir () के आसपास एक आवरण है, इसलिए डेटा को डिलीवर करने के लिए अंडरलेइंग ओएस चार्ज में है। सामान्य तौर पर: आप यहां ऑर्डर देने पर धारणा नहीं बना सकते। बुनियादी धारणा है: कोई आदेश नहीं । यदि आपको कुछ छँटाई की आवश्यकता है: आवेदन स्तर पर छाँटें।


13

आदेश मनमाना है, लेकिन उन्हें हल करने के कई तरीके हैं। उनमें से एक इस प्रकार है:

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

मौजूदा उत्तरों की तुलना में आपका जवाब क्या योगदान देता है?
मार्टिन थोमा

2
@MartinThoma मेरे पास एक ऐसा मुद्दा है, जिसमें फाइल में मौजूद पूर्णांक शून्य गद्देदार नहीं होने के कारण छँटाई नहीं की जाती है। सॉर्टिंग 1000 से शुरू होती है, जो भी उच्चतम पूर्णांक तक जाती है और फिर सबसे छोटे पूर्णांक से वापस शुरू होती है। यदि मैं संख्याओं को शून्य करता हूं, तो फाइलों पर छांटे गए कॉलिंग उन्हें पूरी तरह से हल करते हैं। इसलिए मुझे लगता है कि यह समाधान समस्या को हल करता है जब अकेले काम नहीं करता है।
विल।

1
@ Will.Evo उपयोग करने का प्रयास natsort: from natsort import natsorted; files = natsorted(files)
मार्टिन थोमा

आपके उत्तर ने मदद की!
विनीत

12

मेरे पास एक समान मुद्दा 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])

यह फ़ंक्शन फ़ाइल नाम के संख्यात्मक भाग को वापस करता है और एक पूर्णांक में परिवर्तित करता है। फिर मुझे सूची पर सॉर्ट विधि को इस प्रकार कहा जाता है:

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

मुझे लगता है कि इसके os.path.splitext(os.path.basename(s))[0]बजाय उपयोग करने के लिए यह अधिक सुरुचिपूर्ण है os.path.basename(s)[:-4], इसलिए फ़ंक्शन की परिभाषा होगी। def sortKeyFunc(s): return int(os.path.splitext(os.path.basename(s))[0])
ePandit

1

यदि आप इस बारे में सोच रहे हैं कि ग्लोब.ग्लोब ने अतीत में आपके सिस्टम पर क्या किया है और sortedकॉल को जोड़ नहीं सकता है , तो आदेश मैक एचएफएस + फाइलसिस्टम पर संगत होगा और अन्य यूनिक्स सिस्टम पर ट्रैवर्सल ऑर्डर होगा । तो यह निश्चित रूप से नियतात्मक होगा जब तक कि अंतर्निहित फाइल सिस्टम को पुनर्गठित नहीं किया गया था, जो तब हो सकता है जब फ़ाइलों को जोड़ा गया, हटाया, नाम बदला, हटाया, स्थानांतरित किया गया, आदि ...


MacOS पर APFS के बारे में क्या?
बोरिस

0

@ जोहान ला रोय के समाधान से, छवियों का उपयोग करके sorted(glob.glob('*.png'))मेरे लिए काम नहीं करता है, आउटपुट सूची अभी भी उनके नामों से आदेशित नहीं है।

हालांकि, sorted(glob.glob('*.png'), key=os.path.getmtime)पूरी तरह से काम करता है।

मैं थोड़ा उलझन में हूं कि उनके नाम से छँटाई कैसे हो सकती है।

इस बेहतरीन सवाल को पोस्ट करने के लिए @Martin Thoma और सहायक समाधान के लिए @Johan La Rooy को धन्यवाद।


-1

कृपया इस कोड को आज़माएं:

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

इस तरह मैंने अपना विशेष मामला किया। आशा है कि यह उपयोगी है।


1
प्रश्न को फिट करने के लिए आपको अपना उत्तर बदलना चाहिए।
कोडनमेलांबाडा 15

1
सवाल छँटाई का नहीं है। मुझे पता है (और मुझे तब पता था) कैसे छांटना है। सवाल डिफॉल्ट ऑर्डर को लेकर है।
मार्टिन थोमा

1
इस कोड स्निपेट के लिए धन्यवाद, जो कुछ तत्काल सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि यह समस्या का एक अच्छा समाधान क्यों है, यह दिखाते हुए इसके शैक्षिक मूल्य में बहुत सुधार करेगा , और यह भविष्य के पाठकों के लिए समान के साथ अधिक उपयोगी होगा, लेकिन समान नहीं, प्रश्न। कृपया स्पष्टीकरण जोड़ने के लिए अपना उत्तर संपादित करें, और इस बात का संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
टोबी स्पाइट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.