पायथन में किसी फ़ाइल या फ़ोल्डर को कैसे हटाएं?
पायथन में किसी फ़ाइल या फ़ोल्डर को कैसे हटाएं?
जवाबों:
os.remove()
एक फ़ाइल निकालता है।
os.rmdir()
एक खाली निर्देशिका निकालता है।
shutil.rmtree()
एक निर्देशिका और उसकी सभी सामग्री हटाता है।
Path
पायथन 3.4+ pathlib
मॉड्यूल की वस्तुएं भी इन उदाहरण विधियों को उजागर करती हैं:
pathlib.Path.unlink()
एक फ़ाइल या प्रतीकात्मक लिंक को हटा देता है।
pathlib.Path.rmdir()
एक खाली निर्देशिका निकालता है।
os.remove()
तो एक अपवाद फेंकता है, इसलिए os.path.isfile()
पहले जाँच करना या एक में लपेटना आवश्यक हो सकता है try
।
os.remove()
एक फ़ाइल मौजूद नहीं है, तो द्वारा फेंक दिया FileNotFoundError
।
os.remove()
एकाधिक फ़ाइलों को हटाने के लिए कई तर्क दिए जाते हैं, या क्या आप इसे प्रत्येक फ़ाइल के लिए हर बार कहते हैं?
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()
फ़ाइल या प्रतीकात्मक लिंक को हटाने के लिए उपयोग की गई अनलिंक विधि।
यदि अनुपलब्ध_ोक गलत है (डिफ़ॉल्ट), तो पथ मौजूद नहीं है, तो FileNotFoundError को उठाया जाता है।
यदि अनुपलब्ध_ सही है, तो FileNotFoundError अपवादों को अनदेखा किया जाएगा (POSIX rm -f कमांड के समान व्यवहार)।
संस्करण 3.8 में परिवर्तित: अनुपलब्ध_ओक पैरामीटर जोड़ा गया था।
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))
यहाँ एक मजबूत कार्य है जो दोनों का उपयोग करता है 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))
remove(path);
कॉल को अनुकरण करने के लिए कोड की 8 लाइनें ।
os.path.islink(file_path):
एक बग, होना चाहिएos.path.islink(path):
आप उपयोग कर सकते हैं में निर्मित 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()
pathlib
गैर-खाली निर्देशिका को हटाने का काम हो सकता है। हालाँकि आप उपयोग कर सकते हैं shutil.rmtree
। इसका उल्लेख कई अन्य उत्तरों में किया गया है इसलिए मैंने इसे शामिल नहीं किया है।
मैं पायथन में एक फ़ाइल या फ़ोल्डर को कैसे हटाऊं?
पायथन 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.remove
os.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)))
है।
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)
shutil.rmtree अतुल्यकालिक फ़ंक्शन है, इसलिए यदि आप इसे पूरा होने पर जांचना चाहते हैं, तो आप लूप के रूप में उपयोग कर सकते हैं ...
import os
import shutil
shutil.rmtree(path)
while os.path.exists(path):
pass
print('done')
shutil.rmtree
अतुल्यकालिक नहीं माना जाता है। हालाँकि, यह Windows पर वायरस स्कैनर के हस्तक्षेप के साथ दिखाई दे सकता है।
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
फ़ोल्डर में सभी फ़ाइलों को हटाने के लिए
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))
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()
न केवल निर्देशिका बल्कि इसकी सामग्री भी निकालता है।
मैं subprocess
एक सुंदर और पठनीय कोड लिखने के लिए उपयोग करने की सलाह देता हूं।
import subprocess
subprocess.Popen("rm -r my_dir", shell=True)
और यदि आप एक सॉफ्टवेयर इंजीनियर नहीं हैं, तो शायद जुपिटर का उपयोग करने पर विचार करें; आप बस bash कमांड टाइप कर सकते हैं:
!rm -r my_dir
परंपरागत रूप से, आप उपयोग करते हैं shutil
:
import shutil
shutil.rmtree(my_dir)
subprocess
लिए सिफारिश नहीं करूंगा । विंडोज पर काम करने के अतिरिक्त बोनस के साथ, बस ठीक काम shutil.rmtree
करता है rm -r
।