फाइल या फोल्डर को कैसे डिलीट करें?


जवाबों:


3340
  • os.remove() एक फ़ाइल निकालता है।

  • os.rmdir() एक खाली निर्देशिका निकालता है।

  • shutil.rmtree() एक निर्देशिका और उसकी सभी सामग्री हटाता है।


Pathपायथन 3.4+ pathlibमॉड्यूल की वस्तुएं भी इन उदाहरण विधियों को उजागर करती हैं:

  • pathlib.Path.unlink() एक फ़ाइल या प्रतीकात्मक लिंक को हटा देता है।

  • pathlib.Path.rmdir() एक खाली निर्देशिका निकालता है।


5
Windows पर os.rmdir () भी लक्ष्य प्रतीकात्मक रिक्त न होने पर भी निर्देशिका प्रतीकात्मक लिंक को हटा देता है
Lu55

8
यदि फ़ाइल मौजूद नहीं है, os.remove()तो एक अपवाद फेंकता है, इसलिए os.path.isfile()पहले जाँच करना या एक में लपेटना आवश्यक हो सकता है try
बेन क्रॉउल

2
मैं चाहता हूं कि Path.unlink 1 / recursive 2 / FileNotfoundError को अनदेखा करने के लिए एक विकल्प जोड़ें।
जेरेम

7
बस पूरा करने के लिए ... अपवाद os.remove()एक फ़ाइल मौजूद नहीं है, तो द्वारा फेंक दिया FileNotFoundError
पेड्रो

क्या os.remove() एकाधिक फ़ाइलों को हटाने के लिए कई तर्क दिए जाते हैं, या क्या आप इसे प्रत्येक फ़ाइल के लिए हर बार कहते हैं?
user742864

291

एक फ़ाइल को हटाने के लिए पायथन सिंटैक्स

import os
os.remove("/tmp/<file_name>.txt")

या

import os
os.unlink("/tmp/<file_name>.txt")

या

पाइथन संस्करण के लिए पाथलिब लाइब्रेरी> 3.5

file_to_rem = pathlib.Path("/tmp/<file_name>.txt")
file_to_rem.unlink()

Path.unlink (missing_ok = false)

फ़ाइल या प्रतीकात्मक लिंक को हटाने के लिए उपयोग की गई अनलिंक विधि।

यदि अनुपलब्ध_ोक गलत है (डिफ़ॉल्ट), तो पथ मौजूद नहीं है, तो FileNotFoundError को उठाया जाता है।
यदि अनुपलब्ध_ सही है, तो FileNotFoundError अपवादों को अनदेखा किया जाएगा (POSIX rm -f कमांड के समान व्यवहार)।
संस्करण 3.8 में परिवर्तित: अनुपलब्ध_ओक पैरामीटर जोड़ा गया था।

सर्वश्रेष्ठ प्रणालियां

  1. पहले, जांचें कि फ़ाइल या फ़ोल्डर मौजूद है या नहीं, केवल उस फ़ाइल को हटा दें। यह दो तरीकों से हासिल किया जा सकता है:
    ए। os.path.isfile("/path/to/file")
    ख। उपयोगexception handling.

उदाहरण के लिएos.path.isfile

#!/usr/bin/python
import os
myfile="/tmp/foo.txt"

## If file exists, delete it ##
if os.path.isfile(myfile):
    os.remove(myfile)
else:    ## Show an error ##
    print("Error: %s file not found" % myfile)

उपवाद सम्भालना

#!/usr/bin/python
import os

## Get input ##
myfile= raw_input("Enter file name to delete: ")

## Try to delete the file ##
try:
    os.remove(myfile)
except OSError as e:  ## if failed, report it back to the user ##
    print ("Error: %s - %s." % (e.filename, e.strerror))

प्रतिक्रियाशील परिणाम

हटाने के लिए फ़ाइल का नाम दर्ज करें: Demo.txt
त्रुटि: Demo.txt - ऐसी कोई फ़ाइल या निर्देशिका नहीं।

हटाने के लिए फ़ाइल नाम दर्ज करें: rrr.txt
त्रुटि: rrr.txt - ऑपरेशन की अनुमति नहीं है।

हटाने के लिए फ़ाइल का नाम दर्ज करें: foo.txt

एक फ़ोल्डर को हटाने के लिए पायथन सिंटैक्स

shutil.rmtree()

के लिए उदाहरण shutil.rmtree()

#!/usr/bin/python
import os
import sys
import shutil

# Get directory name
mydir= raw_input("Enter directory name: ")

## Try to remove tree; if failed show an error using try...except on screen
try:
    shutil.rmtree(mydir)
except OSError as e:
    print ("Error: %s - %s." % (e.filename, e.strerror))

13
जाँच से बचने के लिए अपवाद की सिफारिश की जाती है क्योंकि फ़ाइल को दो पंक्तियों के बीच हटाया या बदला जा सकता है (TOCTOU: en.wikipedia.org/wiki/Time_of_check_to_time_of_use ) Python FAQ docs.thon.org/3/glossary.html#term-eafp
Éric अरुजो

84

उपयोग

shutil.rmtree(path[, ignore_errors[, onerror]])

( शटील पर पूर्ण प्रलेखन देखें ) और / या

os.remove

तथा

os.rmdir

( ओएस पर पूर्ण प्रलेखन ।)


6
कृपया अपनी सूची में पैथलिब इंटरफ़ेस (पायथन 3.4 के बाद से नया) जोड़ें।
पैबेल्स

38

यहाँ एक मजबूत कार्य है जो दोनों का उपयोग करता है os.removeऔर shutil.rmtree:

def remove(path):
    """ param <path> could either be relative or absolute. """
    if os.path.isfile(path) or os.path.islink(path):
        os.remove(path)  # remove the file
    elif os.path.isdir(path):
        shutil.rmtree(path)  # remove dir and all contains
    else:
        raise ValueError("file {} is not a file or dir.".format(path))

8
आईएसओ सी remove(path);कॉल को अनुकरण करने के लिए कोड की 8 लाइनें ।
काज

2
@ काज ने नाराज़गी जतायी, लेकिन क्या पेड़ों से सौदा हट जाता है? :-)
सिरो सेंटिल्ली 冠状 ill ill ill 法轮功 '' ''

5
os.path.islink(file_path): एक बग, होना चाहिएos.path.islink(path):
नियो ली

32

आप उपयोग कर सकते हैं में निर्मित pathlibमॉड्यूल (अजगर 3.4+ की आवश्यकता है, लेकिन वहाँ PyPI पर पुराने संस्करणों के लिए backports हैं: pathlib, pathlib2)।

किसी फ़ाइल को निकालने के लिए unlinkविधि है:

import pathlib
path = pathlib.Path(name_of_file)
path.unlink()

या rmdirकिसी खाली फ़ोल्डर को निकालने की विधि :

import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()

2
हालांकि एक गैर-खाली निर्देशिका के बारे में क्या?
प्राणदास

@Pranasas दुर्भाग्य से ऐसा लगता है कि कुछ भी नहीं है (मूल रूप से) इसमें pathlibगैर-खाली निर्देशिका को हटाने का काम हो सकता है। हालाँकि आप उपयोग कर सकते हैं shutil.rmtree। इसका उल्लेख कई अन्य उत्तरों में किया गया है इसलिए मैंने इसे शामिल नहीं किया है।
MSeifert

29

मैं पायथन में एक फ़ाइल या फ़ोल्डर को कैसे हटाऊं?

पायथन 3 के लिए, फ़ाइल और निर्देशिका को अलग-अलग निकालने के लिए, क्रमशः unlinkऔर ऑब्जेक्ट विधियों का उपयोग करें :rmdir Path

from pathlib import Path
dir_path = Path.home() / 'directory' 
file_path = dir_path / 'file'

file_path.unlink() # remove file

dir_path.rmdir()   # remove directory

ध्यान दें कि आप Pathवस्तुओं के साथ सापेक्ष पथों का भी उपयोग कर सकते हैं, और आप अपनी वर्तमान कार्यशील निर्देशिका की जांच कर सकते हैं Path.cwd

पायथन 2 में व्यक्तिगत फ़ाइलों और निर्देशिकाओं को हटाने के लिए, नीचे दिए गए अनुभाग को देखें।

सामग्री, उपयोग shutil.rmtree, और ध्यान दें कि यह पायथन 2 और 3 में उपलब्ध है , के साथ एक निर्देशिका निकालने के लिए :

from shutil import rmtree

rmtree(dir_path)

प्रदर्शन

पायथन 3.4 में नई Pathवस्तु है।

उपयोग करने के लिए डायरेक्टरी और फ़ाइल बनाने के लिए एक का उपयोग करते हैं। ध्यान दें कि हम /पथ के हिस्सों में शामिल होने के लिए उपयोग करते हैं , यह ऑपरेटिंग सिस्टम और विंडोज पर बैकस्लैश का उपयोग करने के मुद्दों (जहां आपको या तो अपने बैकस्लैश को दोगुना करना होगा \\या कच्चे तार का उपयोग करना होगा, जैसे मुद्दों के बीच काम करता है r"foo\bar"):

from pathlib import Path

# .home() is new in 3.5, otherwise use os.path.expanduser('~')
directory_path = Path.home() / 'directory'
directory_path.mkdir()

file_path = directory_path / 'file'
file_path.touch()

और अब:

>>> file_path.is_file()
True

अब इन्हें डिलीट करते हैं। पहली फ़ाइल:

>>> file_path.unlink()     # remove file
>>> file_path.is_file()
False
>>> file_path.exists()
False

हम कई फ़ाइलों को हटाने के लिए ग्लोबिंग का उपयोग कर सकते हैं - पहले इसके लिए कुछ फाइलें बनाते हैं:

>>> (directory_path / 'foo.my').touch()
>>> (directory_path / 'bar.my').touch()

फिर सिर्फ ग्लोब पैटर्न पर पुनरावृति:

>>> for each_file_path in directory_path.glob('*.my'):
...     print(f'removing {each_file_path}')
...     each_file_path.unlink()
... 
removing ~/directory/foo.my
removing ~/directory/bar.my

अब, निर्देशिका को हटाने का प्रदर्शन:

>>> directory_path.rmdir() # remove directory
>>> directory_path.is_dir()
False
>>> directory_path.exists()
False

क्या होगा अगर हम एक निर्देशिका और उसमें सब कुछ निकालना चाहते हैं? इस उपयोग-मामले के लिए, का उपयोग करेंshutil.rmtree

चलो हमारी निर्देशिका और फ़ाइल को फिर से बनाएँ:

file_path.parent.mkdir()
file_path.touch()

और ध्यान दें कि rmdirजब तक यह खाली न हो जाए, तब तक rmtree इतना सुविधाजनक है:

>>> directory_path.rmdir()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "~/anaconda3/lib/python3.6/pathlib.py", line 1270, in rmdir
    self._accessor.rmdir(self)
  File "~/anaconda3/lib/python3.6/pathlib.py", line 387, in wrapped
    return strfunc(str(pathobj), *args)
OSError: [Errno 39] Directory not empty: '/home/username/directory'

अब, rmtree आयात करें और डायरेक्शन को फ़नक्शन में पास करें:

from shutil import rmtree
rmtree(directory_path)      # remove everything 

और हम देख सकते हैं कि पूरी चीज हटा दी गई है:

>>> directory_path.exists()
False

अजगर २

यदि आप पायथन 2 पर हैं, तो पाथलिब मॉड्यूल का एक बैकपोर्ट है, जिसे pathlib2 कहा जाता है , जिसे पाइप के साथ स्थापित किया जा सकता है:

$ pip install pathlib2

और फिर आप पुस्तकालय को अन्य नाम दे सकते हैं pathlib

import pathlib2 as pathlib

या बस सीधे Pathवस्तु आयात करें (जैसा कि यहां दिखाया गया है):

from pathlib2 import Path

यदि यह बहुत अधिक है, तो आप फ़ाइलों को या के साथ हटा सकते हैंos.removeos.unlink

from os import unlink, remove
from os.path import join, expanduser

remove(join(expanduser('~'), 'directory/file'))

या

unlink(join(expanduser('~'), 'directory/file'))

और आप निर्देशिकाओं को निकाल सकते हैं os.rmdir:

from os import rmdir

rmdir(join(expanduser('~'), 'directory'))

ध्यान दें कि वहाँ भी है os.removedirs- यह केवल खाली निर्देशिकाओं को पुन: हटाता है, लेकिन यह आपके उपयोग-मामले के अनुरूप हो सकता है।


rmtree(directory_path)अजगर 3.6.6 में काम करता है, लेकिन अजगर 3.5.2 में नहीं - आप की जरूरत rmtree(str(directory_path)))है।
स्टीन

4
import os

folder = '/Path/to/yourDir/'
fileList = os.listdir(folder)

for f in fileList:
    filePath = folder + '/'+f

    if os.path.isfile(filePath):
        os.remove(filePath)

    elif os.path.isdir(filePath):
        newFileList = os.listdir(filePath)
        for f1 in newFileList:
            insideFilePath = filePath + '/' + f1

            if os.path.isfile(insideFilePath):
                os.remove(insideFilePath)

1
यह केवल फ़ोल्डर और सबफ़ोल्डर्स के अंदर फ़ोल्डर संरचना को छोड़ने वाली फ़ाइलों को हटा देगा।
ललितेश

4

shutil.rmtree अतुल्यकालिक फ़ंक्शन है, इसलिए यदि आप इसे पूरा होने पर जांचना चाहते हैं, तो आप लूप के रूप में उपयोग कर सकते हैं ...

import os
import shutil

shutil.rmtree(path)

while os.path.exists(path):
  pass

print('done')

1
shutil.rmtreeअतुल्यकालिक नहीं माना जाता है। हालाँकि, यह Windows पर वायरस स्कैनर के हस्तक्षेप के साथ दिखाई दे सकता है।
मुहस्तिथ

@ एम्स्मिथ वायरस स्कैनर ? क्या वह जंगली अटकलें हैं, या क्या आप वास्तव में जानते हैं कि वे इस प्रभाव का कारण बन सकते हैं? अगर ऐसा है तो पृथ्वी पर कैसे काम करता है?
मार्क ऐमी

2

फ़ाइलों को हटाने के लिए:

os.unlink(path, *, dir_fd=None)

या

os.remove(path, *, dir_fd=None)

दोनों कार्य शब्दार्थ समान हैं। यह फ़ंक्शन फ़ाइल पथ को हटा (हटाता है)। यदि पथ फ़ाइल नहीं है और यह निर्देशिका है, तो अपवाद उठाया गया है।

फ़ोल्डर हटाने के लिए:

shutil.rmtree(path, ignore_errors=False, onerror=None)

या

os.rmdir(path, *, dir_fd=None)

पूरी निर्देशिका पेड़ों को हटाने के लिए, shutil.rmtree()का उपयोग किया जा सकता है। os.rmdirकेवल तब काम करता है जब निर्देशिका खाली हो और मौजूद हो।

माता-पिता के प्रति पुनरावर्ती रूप से फ़ोल्डर हटाने के लिए:

os.removedirs(name)

यह स्वयं के साथ हर खाली मूल निर्देशिका को हटाता है जब तक कि कुछ सामग्री नहीं है

पूर्व। os.removedirs ('abc / xyz / pqr') निर्देशिकाओं को 'abc / xyz / pqr', 'abc / xyz' और 'abc' द्वारा खाली करने पर निर्देशिकाओं को हटा देगा।

अधिक जानकारी जांच अधिकारी डॉक के लिए: os.unlink, os.remove, os.rmdir, shutil.rmtree,os.removedirs


1

फ़ोल्डर में सभी फ़ाइलों को हटाने के लिए

import os
import glob

files = glob.glob(os.path.join('path/to/folder/*'))
files = glob.glob(os.path.join('path/to/folder/*.csv')) // It will give all csv files in folder
for file in files:
    os.remove(file)

एक डायरेक्टरी में सभी फोल्डर को हटाने के लिए

from shutil import rmtree
import os

// os.path.join()  # current working directory.

for dirct in os.listdir(os.path.join('path/to/folder')):
    rmtree(os.path.join('path/to/folder',dirct))

0

Ujric अरुजो की टिप्पणी से उजागर हुई TOCTOU समस्या से बचने के लिए , आप सही विधि को कॉल करने के लिए एक अपवाद को पकड़ सकते हैं:

def remove_file_or_dir(path: str) -> None:
    """ Remove a file or directory """
    try:
        shutil.rmtree(path)
    except NotADirectoryError:
        os.remove(path)

के बाद से shutil.rmtree()ही निर्देशिका निकाल देंगे और os.remove()या os.unlink()केवल फ़ाइलों को हटा देगा।


shutil.rmtree()न केवल निर्देशिका बल्कि इसकी सामग्री भी निकालता है।
टियागो मार्टिंस पेरेस

-1

मैं subprocessएक सुंदर और पठनीय कोड लिखने के लिए उपयोग करने की सलाह देता हूं।

import subprocess
subprocess.Popen("rm -r my_dir", shell=True)

और यदि आप एक सॉफ्टवेयर इंजीनियर नहीं हैं, तो शायद जुपिटर का उपयोग करने पर विचार करें; आप बस bash कमांड टाइप कर सकते हैं:

!rm -r my_dir

परंपरागत रूप से, आप उपयोग करते हैं shutil:

import shutil
shutil.rmtree(my_dir) 


3
मैं इसके subprocessलिए सिफारिश नहीं करूंगा । विंडोज पर काम करने के अतिरिक्त बोनस के साथ, बस ठीक काम shutil.rmtreeकरता है rm -r
मार्क एमी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.