2013-04-15 5 views
7

मेरे पास एक पाठ फ़ाइल के मानों में पढ़ने के लिए कोड कोड है, लेकिन सभी निर्देशिकाओं से सभी फ़ाइलों को पढ़ने में कठिनाई हो रही है और सभी सामग्रियों को एक साथ रख रहा है।पायथन: सभी निर्देशिकाओं में सभी फ़ाइलों को पढ़ना

filename = '*' 
filesuffix = '*' 
location = os.path.join('Test', filename + "." + filesuffix) 
Document = filename 
thedictionary = {} 
with open(location) as f: 
file_contents = f.read().lower().split(' ') # split line on spaces to make a list 
for position, item in enumerate(file_contents): 
    if item in thedictionary: 
     thedictionary[item].append(position) 
    else: 
     thedictionary[item] = [position] 
wordlist = (thedictionary, Document) 
#print wordlist 
#print thedictionary 

टिप्पणी है कि मैं फ़ाइल नाम के साथ-साथ filesuffix के लिए वाइल्डकार्ड के लिए में वाइल्डकार्ड * छड़ी कोशिश कर रहा हूँ:

यहाँ मैं क्या है। मैं निम्नलिखित त्रुटि मिलती है:

"IOError: [errno 2] इस तरह के कोई फ़ाइल या निर्देशिका: '। टेस्ट/'"

मुझे यकीन है कि अगर यह भी है यह करने के लिए सही तरीके से नहीं कर रहा हूँ लेकिन ऐसा लगता है कि अगर मैं किसी भी तरह वाइल्डकार्ड काम कर रहा हूं - इसे काम करना चाहिए।

मैं काम करने के लिए इस उदाहरण मिल गया है: Python - reading files from directory file not found in subdirectory (which is there)

कौन सा थोड़ा अलग है - लेकिन यह अपडेट करने का तरीका सभी फाइलों को पढ़ने के लिए पता नहीं है। मैं कोड के इस आरंभिक सेट में सोच रहा हूँ कि:

previous_dir = os.getcwd() 
os.chdir('testfilefolder') 
#add something here? 
for filename in os.listdir('.'): 

कि मैं कुछ जहाँ मैं पाश के लिए एक बाहरी है, लेकिन काफी क्या यह में डाल करने के लिए पता नहीं है जोड़ने के लिए की आवश्यकता होगी ..

कोई विचार?

धन्यवाद ज्यादा,

ब्रायन

उत्तर

16

अजगर open() कॉल करने के लिए फ़ाइल नाम में सीधे वाइल्डकार्ड का समर्थन नहीं करता। आपको उपनिर्देशिका के एक स्तर से फ़ाइलों को लोड करने के लिए glob module का उपयोग करने की आवश्यकता होगी, या मनमानी निर्देशिका संरचना चलने के लिए os.walk() का उपयोग करें।

सभी सबडायरेक्टरियों में सभी पाठ फ़ाइलें खोलना, एक स्तर गहरी:

import glob 

for filename in glob.iglob(os.path.join('Test', '*', '*.txt')): 
    with open(filename) as f: 
     # one file open, handle it, next loop will present you with a new file. 

निर्देशिकाओं का एक मनमाना घोंसले में सभी पाठ फ़ाइलें खोलना:

import os 
import fnmatch 

for dirpath, dirs, files in os.walk('Test'): 
    for filename in fnmatch.filter(files, '*.txt'): 
     with open(os.path.join(dirpath, filename)): 
      # one file open, handle it, next loop will present you with a new file. 
+0

उसके लिए आपको Martijn धन्यवाद। मैं इसे आज़माउंगा और देखेंगे कि क्या होता है। मैं उत्सुक हूं कि क्यों वे दो अलग-अलग फ़ंक्शन ग्लोब और ओसवॉक बनाते हैं। थोड़ा पढ़ने पर मुझे लगता है कि ग्लोब आपको वाइल्डकार्ड का उपयोग करने देगा, लेकिन os.walk नहीं होगा - इसके बजाय आपको परिणामों को फ़िल्टर करने की आवश्यकता है। मुझे समझ में नहीं आता कि वास्तव में क्या चल रहा है जब मैं सोच रहा हूं कि परिणाम फ़िल्टर करें, मैंने सोचा कि वाइल्डकार्ड अभिव्यक्ति क्या है। मुझे यह पोस्ट मिला: http://stackoverflow.com/questions/8931099/quicker-to-os-walk-or-glob यदि आपके पास कोई अंतर्दृष्टि और समय है, तो किसी भी विचार की सराहना की जाती है। – Relative0

+0

'ग्लोब() 'मनमाने ढंग से नेस्टेड उपनिर्देशिका (अभी तक) का समर्थन नहीं करता है। यह एकमात्र अंतर है। 'os.walk()' करता है लेकिन अधिक फ़िल्टरिंग की आवश्यकता होती है। ध्यान दें कि 'glob() 'पहले से ही अपने कार्यान्वयन में * उसी फ़िल्टर विधि * (' fnmatch' मॉड्यूल) का उपयोग करता है। –

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