2012-10-25 2 views
6

का उपयोग कर सभी ड्राइव में खोज फाइलें मैं पाइथन के साथ काम करता हूं और मुझे एक फ़ंक्शन या लाइब्रेरी की आवश्यकता होती है जो सभी फ़ाइलों में मेरी फ़ाइलों की खोज करता है, कि मैं इसे विंडोज़ में F3 के रूप में फ़ाइलों का नाम देता हूं जो सभी फ़ोल्डरों पर खोज करता है कम्प्यूटर में। विंडोज़ ओएस, स्थानीय ड्राइव ,, मैं एक कोड लिखनेपाइथन

import os 
import win32api 
paths = 'D:/' 
def dir_list_folder(paths): 
    for folderName in os.listdir(paths): 
     if (folderName.find('.') == -1): 
      folderPath = os.path.join(paths,folderName); 
      dir_list_folder(folderPath); 
     else: 
      print ('Files is :'+ folderName); 

यह मेरे लिए एक अच्छा परिणाम दे लेकिन कुछ प्रकार मुझे एक त्रुटि दे, अगर मैं ज़िप या Rar फ़ाइल कैसे खोज करने की जरूरत नहीं है मैं कर सकता हूं कि

+1

कृपया इसे पहले स्वयं आज़माएं, फिर किसी भी विशेष समस्या के लिए पूछें जिसे आप पार नहीं कर सके। – manas

+0

क्या आप अपनी ज़रूरत पर अधिक सटीक हो सकते हैं, आपका ओएस क्या है, * सभी ड्राइव * से आपका क्या मतलब है: सभी स्थानीय ड्राइव, नेटवर्क साझा डिस्क? – FabienAndre

+0

@silent_warrior संपादित करें प्रश्न देखें –

उत्तर

6

Windows पर, आप os.walk समारोह का उपयोग करने का बेहतर होगा। os.walk एक जेनरेटर देता है जो लगातार स्रोत पेड़ पर चलता है। नीचे दिया गया नमूना एक नियमित अभिव्यक्ति खोज दिखाता है।

import os 
import re 
import win32api 

def find_file(root_folder, rex): 
    for root,dirs,files in os.walk(root_folder): 
     for f in files: 
      result = rex.search(f) 
      if result: 
       print os.path.join(root, f) 
       break # if you want to find only one 

def find_file_in_all_drives(file_name): 
    #create a regular expression for the file 
    rex = re.compile(file_name) 
    for drive in win32api.GetLogicalDriveStrings().split('\000')[:-1]: 
     find_file(drive, rex) 


find_file_in_all_drivers('myfile\.doc') 

कुछ नोट:

  1. मैं फ़ाइल खोज के लिए एक नियमित अभिव्यक्ति का उपयोग कर रहा हूँ। इसके लिए, मैं समय से पहले आरई संकलित कर रहा हूं, और इसे तर्क के रूप में पास कर रहा हूं। अभिव्यक्ति को सामान्यीकृत करना याद रखें - खासकर यदि फ़ाइल नाम किसी दुर्भावनापूर्ण उपयोगकर्ता से आ रहा है।
  2. win32api.GetLogicalDriveStrings सभी चालकों के साथ एक स्ट्रिंग, 0. विभाजन यह द्वारा अलग लौटने के लिए, और उसके बाद पिछले तत्व
  3. बाहर काट चलने के दौरान, आप इस तरह के '.git' या 'के रूप में dirs' खतरनाक फ़ोल्डरों से निकाल सकते हैं '.cvs'। ओसवॉक देखें। उदाहरण के लिए डॉक्टर
  4. नमूना छोटा रखने के लिए, मैंने 'पाया' प्रचार नहीं किया। यदि आप सभी फाइलों को मुद्रित करना चाहते हैं तो 'ब्रेक' निकालें। अगर आप पहली फाइल के बाद रुकना चाहते हैं तो find_file_in_all_drivers को 'ब्रेक' का प्रचार करें।
+1

+1 नहीं खोजना चाहिए। – glglgl

+0

उत्तर के लिए अच्छा एक धन्यवाद, यह बहुत अच्छा काम करता है –

+0

@Uri: मुझे कोड के बारे में थोड़ा सवाल है, यह मुझे पूरा नतीजा नहीं देता है, कारण क्या है? –

1

आपको सी ड्राइव के लिए उदाहरण निर्दिष्ट करने की आवश्यकता है।

def findall(directory): 
    files=os.listdir(directory) 
    for fl in files: 
     path=os.path.join(directory,fl) 
     if os.path.isdir(path): 
      findall(path) 
     else: 
      dosomethingwithfile(path) 
    return 

असल में आप फ़ाइल पेड़ को पार करते हैं। आपको रूट विधि के रूप में इस विधि को ड्राइव पास करना होगा। जैसे। findall ('c: /')

+1

धन्यवाद लेकिन {os.path.isdir (निर्देशिका + '/' + fl)} बिल्कुल ठीक नहीं है –

+0

@ डी.जो यह क्यों और कैसे नहीं? – glglgl

+0

@specialscope 'for' लाइन के बाद' path = os.path.join (निर्देशिका, fl) 'जोड़ें और सभी' निर्देशिका + '/' + fl'with 'path' को प्रतिस्थापित करें। – glglgl

1
import os 
az = lambda: (chr(i)+":\\" for i in range(ord("A"), ord("Z") + 1)) 
for drv in az(): 
    for root, dirs, files in os.walk(drv): 
     process_the_stuff() 

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

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