मैं फ़ाइल को हटाना चाहता हूँ filename
अगर यह मौजूद है। क्या यह कहना उचित है?
if os.path.exists(filename):
os.remove(filename)
क्या कोई बेहतर तरीका है? एक-तरफ़ा रास्ता?
unlink
और इसे नाम स्थान PHP में रखें।
मैं फ़ाइल को हटाना चाहता हूँ filename
अगर यह मौजूद है। क्या यह कहना उचित है?
if os.path.exists(filename):
os.remove(filename)
क्या कोई बेहतर तरीका है? एक-तरफ़ा रास्ता?
unlink
और इसे नाम स्थान PHP में रखें।
जवाबों:
एक अधिक पायथोनिक तरीका होगा:
try:
os.remove(filename)
except OSError:
pass
हालाँकि यह और भी अधिक रेखाएँ लेता है और बहुत ही बदसूरत दिखता है, यह os.path.exists()
अपवादों को खत्म करने के अजगर सम्मेलन के अनावश्यक कॉल से बचता है और इसका अनुसरण करता है।
आपके लिए ऐसा करने के लिए एक फ़ंक्शन लिखना सार्थक हो सकता है:
import os, errno
def silentremove(filename):
try:
os.remove(filename)
except OSError as e: # this would be "except OSError, e:" before Python 2.6
if e.errno != errno.ENOENT: # errno.ENOENT = no such file or directory
raise # re-raise exception if a different error occurred
os.path.exists()
निष्पादित होने पर मौजूद तथ्य का मतलब यह नहीं है कि os.remove()
निष्पादित होने पर यह मौजूद है।
मैं TOCTTOU बग से बचने के लिए फ़ाइल के अस्तित्व की जाँच करने के बजाय एक अपवाद को दबाने को प्राथमिकता देता हूं । मैट का उत्तर इसका एक अच्छा उदाहरण है, लेकिन हम इसका उपयोग करते हुए अजगर 3 के तहत इसे थोड़ा सरल कर सकते हैं contextlib.suppress()
:
import contextlib
with contextlib.suppress(FileNotFoundError):
os.remove(filename)
यदि एक स्ट्रिंग के बजाय filename
एक pathlib.Path
ऑब्जेक्ट है, तो हम .unlink()
उपयोग करने के बजाय इसकी विधि को कॉल कर सकते हैं os.remove()
। मेरे अनुभव में, फ़ाइल सिस्टम मैनिपुलेशन के लिए स्ट्रिंग्स की तुलना में पथ ऑब्जेक्ट अधिक उपयोगी हैं।
चूंकि इस उत्तर में सब कुछ पायथन 3 के लिए अनन्य है, इसलिए यह उन्नयन के लिए एक और कारण प्रदान करता है।
unlink(2)
, जो अब तक का सबसे पुराना प्रासंगिक इंटरफेस है।
except
क्लॉज़ की आवश्यकता है , तो आपको try
/ का उपयोग करना चाहिए except
। इसे सार्थक रूप से छोटा नहीं किया जा सकता है, क्योंकि आपके पास पहले ब्लॉक को शुरू करने के लिए एक पंक्ति होनी चाहिए, स्वयं ब्लॉक, दूसरे ब्लॉक को शुरू करने के लिए एक पंक्ति और फिर उस ब्लॉक को, इसलिए try
/ except
पहले से ही यथासंभव जटिल है।
os.path.exists
True
फ़ोल्डर्स के साथ-साथ फ़ाइलों के लिए रिटर्न । os.path.isfile
इसके बजाय यह जाँचने के लिए उपयोग करें कि फ़ाइल मौजूद है या नहीं।
एंडी जोन्स के जवाब की भावना में, कैसे एक प्रामाणिक टर्नरी ऑपरेशन के बारे में:
os.remove(fn) if os.path.exists(fn) else None
पायथन 3.8 के अनुसार, उपयोग करें missing_ok=True
और pathlib.Path.unlink
( डॉक्स यहां )
from pathlib import Path
my_file = Path("./dir1/dir2/file.txt")
# Python 3.8+
my_file.unlink(missing_ok=True)
# Python 3.7 and earlier
if my_file.exists():
my_file.unlink()
यह जानने का एक और तरीका है कि क्या फ़ाइल (या फ़ाइलें) मौजूद हैं, और इसे हटाने के लिए, मॉड्यूल ग्लोब का उपयोग कर रहा है।
from glob import glob
import os
for filename in glob("*.csv"):
os.remove(filename)
ग्लोब उन सभी फाइलों को ढूंढता है जो पैटर्न का चयन * निक्स वाइल्डकार्ड के साथ कर सकते हैं और सूची को लूप कर सकते हैं।
मैट का उत्तर पुराने पायथन के लिए सही है और केविन नए लोगों के लिए सही उत्तर है।
यदि आप फ़ंक्शन की प्रतिलिपि नहीं बनाना चाहते हैं silentremove
, तो यह कार्यप्रणाली path_pod के रूप में remove_p के रूप में सामने आती है :
from path import Path
Path(filename).remove_p()
if os.path.exists(filename): os.remove(filename)
एक लाइनर है।
आप में से कई असहमत हो सकते हैं - संभवतः ऐसे कारणों के लिए जो टर्नरीज़ के प्रस्तावित उपयोग को "बदसूरत" मानते हैं - लेकिन यह इस सवाल का जवाब देता है कि जब हम कुछ गैर-मानक "बदसूरत" कहते हैं तो हम लोगों को बदसूरत मानकों का उपयोग करना चाहिए।
पायथन 3.4 या बाद के संस्करण में, पायथोनिक तरीका होगा:
import os
from contextlib import suppress
with suppress(OSError):
os.remove(filename)
कुछ इस तरह? शॉर्ट-सर्किट मूल्यांकन का लाभ उठाता है। यदि फ़ाइल मौजूद नहीं है, तो पूरी स्थिति सही नहीं हो सकती है, इसलिए अजगर दूसरे भाग के मूल्यांकन को परेशान नहीं करेगा।
os.path.exists("gogogo.php") and os.remove("gogogo.php")
एक चुंबन की पेशकश:
def remove_if_exists(filename):
if os.path.exists(filename):
os.remove(filename)
और तब:
remove_if_exists("my.file")
मैंने उपयोग किया है rm
जो --preserve-root
विकल्प के रूप में किसी भी फाइल को हटाने के लिए मजबूर कर सकता है rm
।
--preserve-root
do not remove `/' (default)
rm --help | grep "force"
-f, --force ignore nonexistent files and arguments, never prompt
हम सुरक्षित-आरएम ( sudo apt-get install safe-rm
) का भी उपयोग कर सकते हैं
सेफ़-आरएम एक सुरक्षा उपकरण है जिसका उद्देश्य महत्वपूर्ण फाइलों के आकस्मिक विलोपन को रोकने के लिए है / रैपर के साथ बिन / आरएम को हटाकर, जो फ़ाइलों और निर्देशिकाओं के एक विन्यास ब्लैकलिस्ट के खिलाफ दिए गए तर्कों की जांच करता है जिन्हें कभी भी हटाया नहीं जाना चाहिए।
पहले मैं जांचता हूं कि फ़ोल्डर / फ़ाइल पथ मौजूद है या नहीं। यह वैरिएबल फ़ाइल को सेट करने से रोकेगा TTRRove /
folderToRemove to the string
-r / `।
import os, subprocess
fileToRemove = '/home/user/fileName';
if os.path.isfile(fileToRemove):
subprocess.run(['rm', '-f', '--preserve-root', fileToRemove]
subprocess.run(['safe-rm', '-f', fileToRemove]
rm
सुरक्षित रूप से उपयोग करने और रोकने के लिए अपना उत्तर जोड़ा rm -r /
। @JonBrave
rm -f --preserve-root
पर्याप्त अच्छा नहीं है ( --preserve-root
शायद वैसे भी डिफ़ॉल्ट है)। मैंने -r /
एक उदाहरण के रूप में दिया , क्या होगा अगर यह -r /home
या जो भी हो? आप शायद चाहते हैं rm -f -- $fileToRemove
, लेकिन वह बात नहीं है।
os.system('rm ...')
करना बेहद खतरनाक है, क्षमा करें।