2012-08-23 8 views
20

में किसी विशेष क्रम में फ़ाइलों को पढ़ना मान लें कि मेरे पास फ़ोल्डर में तीन फ़ाइलें हैं: file9.txt, file10.txt और file11.txt और मैं उन्हें इस विशेष क्रम में पढ़ना चाहता हूं। क्या कोई मुझे इस बारे में सहायता कर सकता है?पायथन

अभी मैं कोड

import glob, os 
for infile in glob.glob(os.path.join('*.txt')): 
    print "Current File Being Processed is: " + infile 

उपयोग कर रहा हूँ और यह पहली file10.txt पढ़ता है तो file11.txt और फिर file9.txt।

कोई मेरी मदद कर सकता है कि सही आदेश कैसे प्राप्त करें?

उत्तर

41

फाइल सिस्टम पर फ़ाइलें क्रमबद्ध नहीं हैं। आप जिसके परिणामस्वरूप फ़ाइल नाम अपने आप का उपयोग कर सॉर्ट कर सकते हैं sorted() function:

for infile in sorted(glob.glob('*.txt')): 
    print "Current File Being Processed is: " + infile 

नोट अपने कोड में os.path.join कॉल नो-सेशन है; केवल एक तर्क के साथ यह कुछ भी नहीं करता है लेकिन उस तर्क को अनियंत्रित कर देता है।

ध्यान दें कि आपकी फ़ाइलें वर्णमाला क्रम में क्रमबद्ध होंगी, जो 109 से पहले रखती है। आप छंटाई सुधार करने के लिए एक कस्टम कुंजी फ़ंक्शन का उपयोग कर सकते हैं:

import re 
numbers = re.compile(r'(\d+)') 
def numericalSort(value): 
    parts = numbers.split(value) 
    parts[1::2] = map(int, parts[1::2]) 
    return parts 

for infile in sorted(glob.glob('*.txt'), key=numericalSort): 
    print "Current File Being Processed is: " + infile 

numericalSort समारोह एक फ़ाइल नाम में किसी भी अंक बाहर विभाजन, यह एक वास्तविक संख्या में बदल जाता है, और छँटाई के लिए परिणाम देता है:

>>> files = ['file9.txt', 'file10.txt', 'file11.txt', '32foo9.txt', '32foo10.txt'] 
>>> sorted(files) 
['32foo10.txt', '32foo9.txt', 'file10.txt', 'file11.txt', 'file9.txt'] 
>>> sorted(files, key=numericalSort) 
['32foo9.txt', '32foo10.txt', 'file9.txt', 'file10.txt', 'file11.txt'] 
+0

HI। सॉर्ट किए गए फ़ंक्शन दुर्भाग्यवश ऑर्डर को नहीं बदलता है। – user1620012

+0

@ user1620012: सॉर्टिंग ऑर्डर को बेहतर बनाने के लिए मेरा उत्तर अपडेट किया गया। –

+0

hi..actually मेरी फाइलों के नाम हैं .. text-text9-text.txt, text-text10-text.txt आदि – user1620012

6

आप अभिव्यक्ति को sorted(...) कथन के अंदर लपेट सकते हैं और फ़ाइलों की परिणामी सूची क्रमबद्ध कर सकते हैं। उदाहरण:

for infile in sorted(glob.glob('*.txt')): 

आप sorted एक तुलना समारोह दे या, बेहतर कर सकते हैं, key= ... तर्क का उपयोग यह है कि छँटाई के लिए प्रयोग किया जाता है एक कस्टम कुंजी देने के लिए।

उदाहरण:

निम्नलिखित फ़ाइलों हैं:

x/blub01.txt 
x/blub02.txt 
x/blub10.txt 
x/blub03.txt 
y/blub05.txt 

निम्नलिखित कोड निम्नलिखित उत्पादन का उत्पादन होगा:

def key_func(x): 
     return os.path.split(x)[-1] 
for filename in sorted(glob.glob('[xy]/*.txt'), key=key_func): 
     print filename 
# x/blub01.txt 
# x/blub02.txt 
# x/blub03.txt 
# y/blub05.txt 
# x/blub10.txt 
: मुख्य कार्य के साथ अब

for filename in sorted(glob.glob('[xy]/*.txt')): 
     print filename 
# x/blub01.txt 
# x/blub02.txt 
# x/blub03.txt 
# x/blub10.txt 
# y/blub05.txt 

संपादित करें: संभवत: इस कुंजी समारोह आपकी फ़ाइलों को सॉर्ट कर सकते हैं:

pat=re.compile("(\d+)\D*$") 
... 
def key_func(x): 
     mat=pat.search(os.path.split(x)[-1]) # match last group of digits 
     if mat is None: 
      return x 
     return "{:>10}".format(mat.group(1)) # right align to 10 digits. 

यह सुनिश्चित करें कि सुधार किया जा सकता, लेकिन मैं आपको बात समझ में सोचते हैं। संख्याओं के बिना पथ अकेले छोड़े जाएंगे, संख्याओं के साथ पथ एक स्ट्रिंग में परिवर्तित हो जाएंगे जो 10 अंकों चौड़ा है और इसमें संख्या है।

+0

सॉर्ट किए गए फ़ंक्शन दुर्भाग्यवश ऑर्डर को नहीं बदलता है। – user1620012

+0

यह करता है - 'y/blub05.txt' अंतिम स्थिति से ऊपर चलता है क्योंकि 'blub05.txt'' blub10.txt' से पहले आता है। 'Key_func' में निर्देशिका के बिना केवल फ़ाइल नाम की तुलना की जाती है। – hochl

+0

दरअसल मेरी फाइलों में शून्य नहीं है। उनका नाम x/blub1.txt x/blub2.txt x/blub10.txt के रूप में बदल दिया गया है और यह सॉर्ट कमांड के साथ भी एक गलत ऑर्डर उत्पन्न करता है। x/blub3.txt y/blub5.txt – user1620012

-1
for fname in ['file9.txt','file10.txt','file11.txt']: 
    with open(fname) as f: # default open mode is for reading 
     for line in f: 
     # do something with line 
+0

असल में मेरे पास कुछ फाइलें हैं जिन्हें मैं संसाधित करना चाहता हूं। इसलिए सूची बनाना काफी असुविधाजनक है। – user1620012

0
glob.glob(os.path.join('*.txt')) 

स्ट्रिंग की एक सूची देता है, ताकि आप आसानी से अजगर sorted() function का उपयोग कर सूची सॉर्ट कर सकते हैं।

sorted(glob.glob(os.path.join('*.txt'))) 
+0

क्रमबद्ध फ़ंक्शन एक ही परिणाम देता है वर्तमान फ़ाइल प्रसंस्कृत है: file10.txt.txt वर्तमान फ़ाइल संसाधित होने वाली है: file11.txt.txt वर्तमान फ़ाइल संसाधित होने वाली है: file9.txt.txt – user1620012

0

आपको फ़ाइल नाम में संख्या को अलग करके 'ASCIIBetical' से क्रमबद्ध करने की आवश्यकता है।

import re 

def keyFunc(afilename): 
    nondigits = re.compile("\D") 
    return int(nondigits.sub("", afilename)) 

filenames = ["file10.txt", "file11.txt", "file9.txt"] 

for x in sorted(filenames, key=keyFunc): 
    print xcode here 

आप glob.glob के परिणाम के साथ फ़ाइल नाम सेट कर सकते हैं जहां;: तुम कितने तरह ऐसा कर सकते हैं ("* txt।")

Additinally keyFunc फ़ंक्शन मानता है कि फ़ाइल नाम में एक संख्या होगी, और यह संख्या केवल फ़ाइल नाम में है। आप उस फ़ंक्शन को जटिल के रूप में बदल सकते हैं क्योंकि आपको जिस नंबर पर सॉर्ट करने की आवश्यकता है उसे अलग करने की आवश्यकता है।

+0

क्या होगा यदि अलग-अलग फाइलें हों संख्याओं के साथ समूहित नाम? पूर्व। 'foo1.txt',' foo2.txt' .. 'foo10.txt', फिर 'bar1.txt',' bar2.txt', आदि? या फ़ाइल नाम में संख्याओं के दो सेट हैं? –

+0

@MartijnPieters: यह मूल प्रश्न की आवश्यकता नहीं थी, और मुझे लगता है कि आप जवाब जानते हैं। :) – grieve

+0

खैर, सबसे अधिक संभावना है कि सवाल फाइलों का एक छोटा नमूना इस्तेमाल किया; क्योंकि यह '9',' 10', '11' अनुक्रम का महत्वपूर्ण हिस्सा था। हम यह नहीं मान सकते कि हमारे पास पूरी तस्वीर है। :-) –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^