পাইথনকে কীভাবে অর্ডার করা হয় glob.glob?


199

আমি নিম্নলিখিত পাইথন কোড লিখেছি:

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

আদেশ হয় কোন উপায়ে?

এটি আপনাকে আমার এলএস-এল আউটপুট পেতে সহায়তা করতে পারে:

-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
হ্যাঁ, যদি না এটি কোনও বিশেষ প্রচেষ্টা করে, অপারেটিং সিস্টেমটি সরবরাহ করে এটি কেবল এন্ট্রিগুলি দেখায়। ইউনিক্সের "ফাইন্ড" কমান্ডের মতো, এটি অন্তর্নিহিত ফাইল সিস্টেমের দ্বারা ব্যবহৃত ডেটা কাঠামো থেকে যে ক্রমগুলি এনেছে সেগুলি কেবল এন্ট্রিগুলিকে ফেলে দেয়। এর ক্রমটি সম্পর্কে আপনার কোনও অনুমান করা উচিত নয়, এমনকি যদি আপনি দেখতে পান যে ফাইলগুলি ক্রম ক্রমে প্রদর্শিত হচ্ছে।
রাউল সালিনাস-

421

অর্ডার স্বেচ্ছাসেবী, তবে আপনি সেগুলি নিজেই বাছাই করতে পারেন

আপনি যদি নাম অনুসারে বাছাই করতে চান:

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/*')। নাম দ্বারা আদেশ দেওয়া হবে?
andilabs

3
@ মিগলস না, আমি যে প্রশ্নটি চেয়েছিলাম তা আসলে এটি ছিল না। আমি যা জানতে চাইলাম তার জিয়ন জবাব দিয়েছিল।
মার্টিন থোমা

এবং এটি তৈরির তারিখ অনুসারে বাছাই করার বিষয়ে তবে সৃষ্টির সময় অনুযায়ী। কারণ এটি আমাকে নতুনতম ফাইলগুলি তালিকাবদ্ধ করে। আমি কীভাবে পুরানো থেকে নবীনতম ফাইলগুলিতে একটি তালিকা পেতে পারি? ধন্যবাদ!
joaquindev

1
নোট করুন যে গেটটাইম এবং গাইজাইম তুলনামূলকভাবে ব্যয়বহুল - প্রচুর ফাইলের জন্য এটি করতে কিছুটা সময় লাগতে পারে ..
ড্রেভিকো

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
@ মার্টিন থোমা আমার একটি সমস্যা আছে যদি ফাইলগুলির মধ্যে উপস্থিত পূর্ণসংখ্যাগুলি শূন্য প্যাড না হয় তবে ফাইলের নামগুলি বাছাই না করা উচিত। বাছাই 1000 থেকে শুরু হয়, সর্বোচ্চ পূর্ণসংখ্যার যেকোন কিছুতে যায় এবং তারপরে সবচেয়ে ছোট পূর্ণসংখ্যা থেকে শুরু হয়। আমি যদি সংখ্যাগুলিকে শূন্য প্যাড করি, কেবলমাত্র ফাইলগুলিতে কল করা কলগুলি তাদের সঠিকভাবে সাজায়। সুতরাং আমি মনে করি এই সমাধানটি সমস্যার সমাধান করে যখন একাই বাছাই করা কাজ করে না।
উইল.এভো

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

এই ফাংশনটি ফাইলের সংখ্যার অংশটি দেয় এবং পূর্ণসংখ্যায় রূপান্তর করে then

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

আপনি যদি ভাবছেন যে অতীতে আপনার সিস্টেমে glob.glob কী করেছে এবং কোনও sortedকল যোগ করতে না পারে তবে ক্রমটি ম্যাক এইচএফএস + ফাইল সিস্টেমে সামঞ্জস্যপূর্ণ এবং অন্যান্য ইউনিক্স সিস্টেমে ট্র্যাভারসাল ক্রম হবে । সুতরাং অন্তর্নিহিত ফাইল সিস্টেমটি পুনর্গঠিত না করা হলে এটি সম্ভবত নির্বিচারে সংঘটিত হতে পারে যা যদি ফাইলগুলি যুক্ত করা, অপসারণ করা, পুনরায় নামকরণ, মুছে ফেলা, সরানো ইত্যাদিতে ঘটতে পারে ...


ম্যাকোসে এপিএফএস সম্পর্কে কী?
বরিস

0

@ জোহান লা রুইয়ের সমাধান থেকে, চিত্রগুলি ব্যবহার sorted(glob.glob('*.png'))করে বাছাই করা আমার পক্ষে কাজ করে না, আউটপুট তালিকা এখনও তাদের নাম অনুসারে অর্ডার করা হয়নি।

যাইহোক, sorted(glob.glob('*.png'), key=os.path.getmtime)পুরোপুরি কাজ করে।

আমি কিছুটা বিভ্রান্ত হয়ে পড়েছি কীভাবে তাদের নামগুলি বাছাই করতে পারে তা এখানে কাজ করে না।

সহায়ক সমাধানের জন্য এই দুর্দান্ত প্রশ্ন পোস্ট করার জন্য @ মার্টিন থোমা এবং @ জোহান লা রুইকে ধন্যবাদ জানাই।


-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
প্রশ্নের উত্তর ফিট করার জন্য আপনার উত্তরটি পরিবর্তন করা উচিত।
কোডেনামলাম্বদা

1
প্রশ্ন বাছাই সম্পর্কে নয়। আমি জানি (এবং আমি তখনও জানতাম) কীভাবে বাছাই করা যায়। প্রশ্নটি ডিফল্ট অর্ডার সম্পর্কে।
মার্টিন থোমা

1
এই কোড স্নিপেটের জন্য আপনাকে ধন্যবাদ, যা কিছু তাত্ক্ষণিক সহায়তা সরবরাহ করতে পারে। একটি সঠিক ব্যাখ্যা কেন এটি সমস্যার একটি ভাল সমাধান তা দেখিয়ে তার শিক্ষাগত মানকে ব্যাপকভাবে উন্নত করবে এবং ভবিষ্যতের পাঠকদের জন্য একই, তবে অভিন্ন নয়, এমন প্রশ্নের সাথে আরও দরকারী করে তুলবে। দয়া করে ব্যাখ্যা যুক্ত করতে আপনার উত্তর সম্পাদনা করুন, এবং কোন সীমাবদ্ধতা এবং অনুমানগুলি প্রযোজ্য তা একটি ইঙ্গিত দিন।
টবি স্পিড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.