2010-01-03 7 views
123

के साथ निर्देशिका में सभी फ़ाइलों को हटाने से मैं निर्देशिका में .bak एक्सटेंशन के साथ सभी फ़ाइलों को हटाना चाहता हूं। मैं पाइथन में ऐसा कैसे कर सकता हूं?पाइथन

+5

@ slh2080: पोस्ट कर रहा है "हल" नहीं है क्या आप इस साइट पर है। आप जो करते हैं वह वह जवाब चुनते हैं जिसका आपने वास्तव में उपयोग किया था और यह इंगित करने के लिए चेक-मार्क पर क्लिक करें कि यह आपकी समस्या का समाधान करता है। –

+0

क्षमा करें। मेरी गलती को इंगित करने के लिए धन्यवाद। यह होमवर्क नहीं है, बस मेरे खाली समय में पाइथन सीख रहा है। मैंने उस उत्तर पर क्लिक किया जिसका मैंने उपयोग किया था, लेकिन इससे पहले कि मैंने ghostdog74 प्रतिक्रिया देखी थी। – slh2080

+0

नोट: एक संपूर्ण निर्देशिका पेड़ को हटाने के लिए ['shutil.rmtree (पथ) 'का उपयोग किया जा सकता है] (https://docs.python.org/3/library/shutil.html#shutil.rmtree)। – jfs

उत्तर

221

os.listdir और os.remove वाया:

import os 

filelist = [ f for f in os.listdir(mydir) if f.endswith(".bak") ] 
for f in filelist: 
    os.remove(os.path.join(mydir, f)) 

या के माध्यम से glob.glob:

import glob, os, os.path 

filelist = glob.glob(os.path.join(mydir, "*.bak")) 
for f in filelist: 
    os.remove(f) 

अंततः os.chdir का उपयोग कर, सही निर्देशिका में होना करने के लिए सुनिश्चित करें।

+16

आपका पहला उदाहरण लूप के लिए अनावश्यक उपयोग कर रहा है। Oslistdir ("।") में f के लिए आप [os.remove (f) के साथ पास कर सकते हैं यदि f.endswith ("। Bak")] - सूची समझ के रूप में उपयोग किया जाना है। या आप os.listdir ("।") में f के लिए 'if' को समझने के लिए 'if' स्थानांतरित कर सकते हैं - f.endswith ("। Bak"): os.remove (f) – dragonjujo

+0

@ slh2080 चूंकि आप कहते हैं कि समस्या हल हो गई है, तो उत्तर को सही उत्तर के रूप में क्यों चिह्नित न करें? – blwy10

+4

@dragonjujo, हाँ मुझे पता है, लेकिन मैंने सोचा कि यह इस तरह से स्पष्ट होगा .. – miku

23

निर्देशिका बदलने के लिए os.chdir का उपयोग करें। फ़ाइल नामों की एक सूची उत्पन्न करने के लिए glob.glob का उपयोग करें जो इसे '.bak' समाप्त करता है। सूची के तत्व सिर्फ तार हैं।

फिर आप फ़ाइलों को हटाने के लिए os.unlink का उपयोग कर सकते हैं। (पी एस। os.unlink और os.remove एक ही समारोह के लिए समानार्थक शब्द हैं।)

#!/usr/bin/env python 
import glob 
import os 
directory='/path/to/dir' 
os.chdir(directory) 
files=glob.glob('*.bak') 
for filename in files: 
    os.unlink(filename) 
6

आप एक समारोह बना सकते हैं। उपनिर्देशिकाओं को ट्रैवर्स करने के लिए आपको पसंद करते हुए maxdepth जोड़ें। ऑब्जेक्ट के गुणों कि समारोह द्वारा लौटाई गई के लिए os.DirEntry देखते हैं - आप फ़ाइल विशेषताओं या प्रकार के लिए जांच करने की आवश्यकता है, तो

def findNremove(path,pattern,maxdepth=1): 
    cpath=path.count(os.sep) 
    for r,d,f in os.walk(path): 
     if r.count(os.sep) - cpath <maxdepth: 
      for files in f: 
       if files.endswith(pattern): 
        try: 
         print "Removing %s" % (os.path.join(r,files)) 
         #os.remove(os.path.join(r,files)) 
        except Exception,e: 
         print e 
        else: 
         print "%s removed" % (os.path.join(r,files)) 

path=os.path.join("/home","dir1","dir2") 
findNremove(path,".bak") 
7

अजगर 3.5 में, os.scandir बेहतर है।

import os 

for file in os.scandir(path): 
    if file.name.endswith(".bak"): 
     os.unlink(file.path) 

यह भी प्रत्येक DirEntry के बाद से निर्देशिका को बदलने की आवश्यकता नहीं है पहले से ही फाइल करने के लिए पूरा पथ भी शामिल है।

+0

आप एक कोलन खो रहे हैं, लूप के अंदर पहली पंक्ति 'if.name.endswith ("। Bak") होनी चाहिए: ' – TSeymour

+0

धन्यवाद!वह मुझे वास्तव में उन्हें चलाने के बिना कोड लिखने के लिए सिखाएगा –

0

Linux और MacOS पर आप खोल करने के लिए सरल आदेश चला सकते हैं:

subprocess.run('rm /tmp/*.bak', shell=True) 
+0

मेरी राय में कोई अच्छा विकल्प नहीं है। यह पोर्टेबल नहीं है और अतिरिक्त उपप्रवाह के कारण यह शायद अधिक महंगा है। पायथन एपीआई का उपयोग करने के लिए बेहतर है। – Haakon