2012-11-26 16 views
31

मेरे पास एक रूट-आईएसएच निर्देशिका है जिसमें एकाधिक उपनिर्देशिकाएं हैं, जिनमें से सभी में फ़ाइल नाम data.txt है। मैं जो करना चाहता हूं वह एक स्क्रिप्ट लिखना है जो "रूट" निर्देशिका में लेता है, और उसके बाद सभी उपनिर्देशिकाओं के माध्यम से पढ़ता है और उपनिर्देशिका में प्रत्येक "data.txt" पढ़ता है, और फिर प्रत्येक डेटा.txt फ़ाइल से सामान लिखता है एक आउटपुट फाइल।सभी उपनिर्देशिकाओं के माध्यम से बार-बार कैसे जाते हैं और फ़ाइलों को पढ़ते हैं?

यहाँ मेरी कोड का एक टुकड़ा है:

import os 
import sys 
rootdir = sys.argv[1] 

with open('output.txt','w') as fout: 
    for root, subFolders, files in os.walk(rootdir): 
     for file in files: 
      if (file == 'data.txt'): 
       #print file 
       with open(file,'r') as fin: 
        for lines in fin: 
         dosomething() 

मेरे DoSomething() भाग - मैं परीक्षण किया है और अगर मैं सिर्फ एक फ़ाइल के लिए वह हिस्सा चला रहा हूँ यह काम करने के लिए की पुष्टि की है। मैंने यह भी पुष्टि की है कि यदि मैं इसे फ़ाइल को प्रिंट करने के लिए कहता हूं (टिप्पणी की गई पंक्ति) लिपि 'data.txt' प्रिंट करती है।

अभी अगर मैं इसे चलाने अजगर मुझे इस त्रुटि देता है:

File "recursive.py", line 11, in <module> 
    with open(file,'r') as fin: 
IOError: [Errno 2] No such file or directory: 'data.txt' 

मुझे यकीन है कि क्यों यह यह नहीं मिल सकता है नहीं कर रहा हूँ - सब के बाद, यह data.txt बाहर प्रिंट अगर मैं uncomment 'प्रिंट फाइल' लाइन। मैं गलत तरीके से क्या कर रहा हूँ?

+1

बस एक शैली टिप्पणी के लिए रास्तों की सरणी को बचाने: एक बार नेस्टिंग इस गहरे हो जाता है, इसे पढ़ने के लिए कठिन हो सकता है। सरल बनाने के लिए, मैं आंतरिक भाग को एक अलग 'def do_file (फ़ाइल नाम) में डाल दूंगा: ...' फ़ंक्शन। आप 'स्तर ==' data.txt 'भी कर सकते हैं: जारी रखें' को सरल बनाने और वहां एक स्तर को सहेजने के लिए। यह भी देखें [पीईपी 20] (http://www.python.org/dev/peps/pep-0020/): "फ्लैट नेस्टेड से बेहतर है"। –

उत्तर

50

आपको पूर्ण पथ का उपयोग करने की आवश्यकता है, तो file वैरिएबल केवल एक निर्देशिका फ़ाइल के बिना एक स्थानीय फ़ाइल नाम है।

with open('output.txt','w') as fout: 
    for root, subFolders, files in os.walk(rootdir): 
     if 'data.txt' in files: 
      with open(os.path.join(root, 'data.txt'), 'r') as fin: 
       for lines in fin: 
        dosomething() 
+0

यह पूरी तरह से काम किया। धन्यवाद! – Joe

+7

यदि मेरे जैसे, कोई भी इसे पढ़ने वाले फ़ाइल नामों को अतिरिक्त रूप से फ़िल्टर करना चाहता है, तो इस प्रश्न का उत्तर बहुत उपयोगी साबित हुआ: http://stackoverflow.com/questions/2186525/use-a-glob-to-find-files -recursively-in-python – BigglesZX

+2

['os.walk()' + symlinks का पालन करें] (http://stackoverflow.com/questions/3771696/python-os-walk-follow-symlinks) यह अनुवर्ती लिंक कैसे प्राप्त करें पते को संबोधित करता है। – Schorsch

0
[os.path.join(dirpath, filename) for dirpath, dirnames, filenames in os.walk(rootdir) 
           for filename in filenames] 

एक कार्यात्मक दृष्टिकोण पेड़ छोटे, अधिक स्पष्ट और pythonic लग रहा है पाने के लिए: root चर कि मार्ग है।

आप किसी भी समारोह में os.path.join(dirpath, filename) लपेट फ़ाइलें आप प्राप्त कार्रवाई करने के लिए कर सकते हैं या आगे की प्रक्रिया के

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