पायथन के साथ एक निर्देशिका में सभी फ़ाइलों को हटाना


147

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


5
@ slh2080: "सॉल्व्ड" पोस्टिंग वह नहीं है जो आप इस साइट पर करते हैं। आप जो कुछ भी करते हैं, उसका उत्तर वह है जो आपने वास्तव में उपयोग किया था और यह इंगित करने के लिए चेक-मार्क पर क्लिक करें कि इससे आपकी समस्या हल हो गई है।
एस.लॉट

1
माफ़ करना। मेरी गलती को इंगित करने के लिए धन्यवाद। यह होमवर्क नहीं है, बस अपने खाली समय में अजगर सीखना। मैंने उस उत्तर पर क्लिक किया जिसका मैंने उपयोग किया था, लेकिन इससे पहले कि मैंने घोस्टडॉग74 प्रतिक्रिया देखी।
slh2080

नोट: एक पूरी निर्देशिका ट्री को हटाने के लिए shutil.rmtree(path)इस्तेमाल किया जा सकता है
13:15

जवाबों:


270

वाया 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


21
आपका पहला उदाहरण छोरों के लिए निरर्थक उपयोग कर रहा है। आप एक के साथ पास कर सकते हैं - [os.remdir (f।) के लिए os.listdir ("।") में यदि f.endwith ("। Bak")] - सूची बोध का उपयोग करने के लिए है। या आप 'if' को '' if '' में ले जा सकते हैं - for में for - in os.listdir ("।"): अगर f.endwith ("। Bak"): os.remove (f)
dragonhujo

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

5
बाहर देखें os.listdir ("।") !!! मैंने इस कोड का उपयोग किया और रास्ता बदलना भूल गया, मेरे सभी कोड चले गए थे !!! पुनर्प्राप्त करने के लिए दो अलग-अलग उपयोगिताओं की कोशिश की, लेकिन भाग्य के साथ नहीं !!
लेई गुओ

@LeiGuo ने तय किया कि।
युगर

26

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

तब आप os.unlinkफ़ाइलों को हटाने के लिए उपयोग कर सकते हैं । (PS 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)

18

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

import os 

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

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


आप एक बृहदान्त्र को याद कर रहे हैं, लूप के लिए पहली पंक्ति होनी चाहिएif file.name.endswith(".bak"):
TSeymour

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

8

आप एक फंक्शन बना सकते हैं। सबडायरेक्ट्रीज़ को ट्रैवर्स करने के लिए जैसा आप चाहें, मैक्सडेप जोड़ें।

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")


1

Linux और macOS पर आप सरल कमांड को शेल में चला सकते हैं:

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

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

0

मुझे एहसास है कि यह पुराना है; हालांकि, यहाँ कैसे सिर्फ ओएस मॉड्यूल का उपयोग कर ऐसा करना होगा ...

def purgedir(parent):
    for root, dirs, files in os.walk(parent):                                      
        for item in files:
            # Delete subordinate files                                                 
            filespec = os.path.join(root, item)
            if filespec.endswith('.bak'):
                os.unlink(filespec)
        for item in dirs:
            # Recursively perform this operation for subordinate directories   
            purgedir(os.path.join(root, item))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.