অজানা থাকতে পারে এমন কোনও ফাইল মুছতে সর্বাধিক অজগর উপায়


453

ফাইলটি filenameউপস্থিত থাকলে মুছতে চাই to বলা কি যথাযথ?

if os.path.exists(filename):
    os.remove(filename)

একটি ভাল উপায় আছে কি? এক লাইনের পথ?


7
আপনি কি কোনও ফাইল উপস্থিত থাকলে মুছে ফেলার চেষ্টা করতে চান (এবং আপনার অনুমতি না থাকলে ব্যর্থ হন) বা সেরা-প্রচেষ্টা মুছতে চান এবং আপনার মুখে কখনও ত্রুটি ফেলা হয় না?
ডোনাল ফেলো

আমি ডোনালফেলো যা বলেছিলাম তার "প্রাক্তন" করতে চেয়েছিলাম। তার জন্য, আমি অনুমান করি স্কট এর মূল কোডটি একটি ভাল পদ্ধতির হবে?
লার্শ

ডাকা একটি ফাংশন তৈরি করুন unlinkএবং এটি নেমস্পেস পিএইচপি রাখুন।
lama12345

1
@ লারশ গৃহীত উত্তরের দ্বিতীয় কোড ব্লকটি দেখুন। ব্যতিক্রমটি "এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নয়" ত্রুটি ছাড়া কিছু হলে এটি ব্যতিক্রমটিকে পুনরায় আকার দেয়।
jpmc26

উত্তর:


613

আরও অজগর উপায় হ'ল:

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

17
তবে সরানো অপারেশন ব্যর্থ হলে (কেবলমাত্র ফাইল সিস্টেম বা অন্য কোনও অপ্রত্যাশিত সমস্যা পড়ুন) এই পাস হবে?
স্কট সি উইলসন

134
এছাড়াও, os.path.exists()মৃত্যুদন্ড কার্যকর করার সময় ফাইলটি উপস্থিত থাকার অর্থ এই নয় যে os.remove()মৃত্যুদন্ড কার্যকর করার সময় এটি উপস্থিত থাকে ।
kindall

8
আমার +1, তবে ব্যতিক্রমগুলি অতিরিক্ত ব্যবহার করা পাইথন কনভেনশন নয় :) নাকি এটি?
পিআরপি

8
@ পেপার আমি অদ্ভুতভাবে ব্যতিক্রমগুলি কীভাবে পাইথনের সাধারণ আচরণের অঙ্গ, তা আমি কৌতুকপূর্ণভাবে সমালোচনা করছিলাম। উদাহরণস্বরূপ, পুনরাবৃত্তি বন্ধ করতে পুনরাবৃত্তকারীদের অবশ্যই ব্যতিক্রম বাড়াতে হবে
ম্যাট

5
+1 কারণ আমি +2 করতে পারি না। বেশি পাইথোনিক হওয়ার পাশাপাশি এটি প্রকৃতপক্ষে সঠিক, যদিও মূল কারণটি নেই, কারণ ক্যানডাল প্রস্তাবিত। নিরাপত্তা গর্ত, হার্ড-টু-repro বাগ, ইত্যাদি যে নেতৃত্ব মত রেস অবস্থার
abarnert

159

টেকটিউ বাগটি এড়াতে আমি ফাইলটির অস্তিত্ব পরীক্ষা করার চেয়ে একটি ব্যতিক্রমকে দমন করতে পছন্দ করি । ম্যাট এর উত্তর এটির একটি ভাল উদাহরণ, তবে আমরা পাইথন 3 এর অধীনে এটিকে কিছুটা সহজ করতে পারি contextlib.suppress():

import contextlib

with contextlib.suppress(FileNotFoundError):
    os.remove(filename)

যদি স্ট্রিংয়ের পরিবর্তে filenameকোনও pathlib.Pathঅবজেক্ট হয় তবে আমরা .unlink()ব্যবহার না করে তার পদ্ধতিটি কল করতে পারিos.remove() । আমার অভিজ্ঞতায়, ফাইল সিস্টেম ম্যানিপুলেশনের জন্য স্ট্রিংয়ের চেয়ে পাথ অবজেক্টগুলি বেশি কার্যকর।

যেহেতু এই উত্তরের সমস্ত কিছুই পাইথন 3 এ একচেটিয়া, তাই এটি আপগ্রেড করার আরও একটি কারণ সরবরাহ করে।


7
২০১৫ সালের ডিসেম্বরের মতো এটি সর্বাধিক পাইথোনিক উপায় Py যদিও পাইথনটি বিকশিত হতে থাকে।
মায়াঙ্ক জয়সওয়াল

2
পাইথন ৩.6
প্যাথ

1
@ জেফবিয়ার্নস: আমি এটিকে পাইথনের জেনের লঙ্ঘন বলেছি: "এখানে একটি হওয়া উচিত - এবং এটি করার একমাত্র উপায় - সম্ভবত উপায়" " যদি আপনার কাছে দুটি পদ্ধতি থাকে যা একই কাজ করে, আপনি চলমান উত্স কোডে সেগুলির একটি মিশ্রণটি শেষ করবেন, যা পাঠকের পক্ষে অনুসরণ করা আরও কঠিন। আমি সন্দেহ করি যে তারা এটির সাথে ধারাবাহিকতা চেয়েছিল unlink(2), এটি এখানকার প্রাচীনতম প্রাসঙ্গিক ইন্টারফেস।
কেভিন

1
@ নিভক: আপনার যদি একটি exceptধারা প্রয়োজন , তবে আপনার try/ ব্যবহার করা উচিত except। এটি অর্থপূর্ণভাবে সংক্ষিপ্ত করা যাবে না, কারণ আপনার অবশ্যই প্রথম ব্লকটি পরিচয় করানোর জন্য একটি লাইন থাকতে হবে, ব্লকটি নিজেই, দ্বিতীয় ব্লকের প্রবর্তনের জন্য একটি লাইন এবং তারপরে সেই ব্লকটি, সুতরাং try/ exceptইতিমধ্যে যতটা সম্ভব ক্ষুদ্রতর।
কেভিন

1
এটি উল্লেখ করা মূল্যবান যে একটি চেষ্টা / ব্লক ব্যতীত, এই সমাধানটির অর্থ পরীক্ষার কভারেজের মেট্রিকগুলি প্রাসঙ্গিক কিনা তা নিশ্চিত করার জন্য আপনাকে একটি ব্যতিক্রম তৈরি করতে গোলমাল করতে হবে না।
thclark

50

os.path.existsTrueফোল্ডারগুলির পাশাপাশি ফাইলগুলির জন্য ফেরত দেয় । os.path.isfileপরিবর্তে ফাইলটি বিদ্যমান কিনা তা পরীক্ষা করার জন্য বিবেচনা করুন ।


4
যে কোনও সময় আমরা অস্তিত্বের জন্য পরীক্ষা করি এবং তারপরে সেই পরীক্ষার ভিত্তিতে অপসারণ করি, আমরা নিজেকে একটি জাতি শর্তের দিকে উন্মুক্ত করছি। (যদি ফাইলটি এর মধ্যে অদৃশ্য হয়ে যায় তবে কী হবে?)
অ্যালেক্স এল

34

অ্যান্ডি জোনসের জবাবের অনুপ্রেরণায়, কীভাবে একটি খাঁটি টের্নারি অপারেশন সম্পর্কে:

os.remove(fn) if os.path.exists(fn) else None

41
ভূখণ্ডের কুরুচিপূর্ণ অপব্যবহার।
বিগুসাচ

19
@ ব্রায়ান এইচভিবি, কারণ শাখা প্রশাখি করতে নয়, শর্তের ভিত্তিতে দুটি মানের মধ্যে বাছাই করতে টের্নারিগুলি রয়েছে।
বিগুসাচ

1
আমি প্রবাহ নিয়ন্ত্রণের জন্য ব্যতিক্রমগুলি ব্যবহার করতে পছন্দ করি না। এগুলি কোড বোঝা মুশকিল করে এবং আরও গুরুত্বপূর্ণভাবে ঘটছে এমন কিছু অন্যান্য ত্রুটি মাস্ক করতে পারে (যেমন কোনও ফাইল মুছতে বাধা দেওয়ার অনুমতি ইস্যুতে) যা নিঃশব্দ ব্যর্থতার কারণ হবে।
এড কিং

11
এটি পারমাণবিক নয়। কলটি বিদ্যমান থাকা এবং অপসারণের মধ্যে ফাইলটি মুছতে পারে। অপারেশনটি চেষ্টা করা এবং এটি ব্যর্থ হওয়ার অনুমতি দেওয়া নিরাপদ।
কনারডব্লগার্ভে

1
@ নাম-জি-ভু জাস্ট এফআইআই, আমি আপনার সম্পাদনাটি ফিরিয়ে নিয়েছি কারণ আপনি মূলত একটি বিকল্প হিসাবে মূল প্রশ্নকারীর বাক্য গঠনকে যুক্ত করেছেন। যেহেতু তারা এর চেয়ে আলাদা কিছু খুঁজছিল, তাই আমি মনে করি না যে সম্পাদনাটি এই নির্দিষ্ট উত্তরের জন্য জার্মানি।
টিম কিটিং

9

ফাইল (বা ফাইল) বিদ্যমান আছে কিনা তা জানার এবং এটি অপসারণের আরেকটি উপায় মডিউল গ্লোব ব্যবহার করছে।

from glob import glob
import os

for filename in glob("*.csv"):
    os.remove(filename)

গ্লোব এমন সমস্ত ফাইল সন্ধান করে যা * নিক্স ওয়াইল্ডকার্ডের সাহায্যে প্যাটার্নটি নির্বাচন করতে পারে এবং তালিকাটি লুপ করে।


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

1
আমার মতে ব্যবহারিক পাইথন 3 এর সেরা উত্তর।
mrgnw

7

ম্যাট এর উত্তরটি পুরানো পাইথনসের জন্য সঠিক এবং নতুনদের জন্য কেভিনের সঠিক উত্তর।

আপনি যদি ফাংশনটির অনুলিপি না করতে চান তবে silentremoveএই কার্যকারিতাটি path.pyঅপসারণ_পি হিসাবে প্রকাশ করা হবে :

from path import Path
Path(filename).remove_p()

6
if os.path.exists(filename): os.remove(filename)

ওয়ান লাইনার

আপনারা অনেকেই দ্বিমত পোষণ করতে পারেন - সম্ভবত "কুরুচিপূর্ণ" টার্নারিগুলির প্রস্তাবিত ব্যবহার বিবেচনা করার মতো কারণগুলির জন্য - তবে এটি এই প্রশ্নটি জাগিয়ে তোলে যে তারা যখন অ-মানক "কুশ্রী" বলে তখন আমরা কুৎসিত মানদণ্ডে ব্যবহৃত লোকেরা কী শুনতে পারা উচিত।


3
এটি পরিষ্কার - আমি প্রবাহ নিয়ন্ত্রণের জন্য ব্যতিক্রম ব্যবহার করতে পছন্দ করি না। এগুলি কোড বোঝা মুশকিল করে এবং আরও গুরুত্বপূর্ণভাবে ঘটছে এমন কিছু অন্যান্য ত্রুটি মাস্ক করতে পারে (যেমন কোনও ফাইল মুছতে বাধা দেওয়ার অনুমতি ইস্যুতে) যা নিঃশব্দ ব্যর্থতার কারণ হবে।
এড কিং

2
এটি সুন্দর নয় কারণ এটি ধরে নিয়েছে যে কেবলমাত্র একটি প্রক্রিয়া রয়েছে যা ফাইলের নাম পরিবর্তন করবে। এটি পারমাণবিক নয়। অপারেশন চেষ্টা করার জন্য এটি নিরাপদ এবং সঠিক এবং নিখুঁতভাবে ব্যর্থ। এটি বিরক্তিকর যে পাইথন মানক করতে পারে না। আমাদের যদি ডিরেক্টরি থাকে তবে আমরা শুটিল ব্যবহার করতাম এবং এটি আমরা যা চাই ঠিক তা সমর্থন করে।
কনারডব্লগারভি


1

এটার মতো কিছু? শর্ট সার্কিট মূল্যায়নের সুবিধা নেয়। যদি ফাইলটি বিদ্যমান না থাকে তবে পুরো শর্তসাপেক্ষ সত্য হতে পারে না, সুতরাং পাইথন দ্বিতীয় অংশের মূল্যায়নকে বিরক্ত করবে না।

os.path.exists("gogogo.php") and os.remove("gogogo.php")

25
এটি অবশ্যই "বেশি পাইথোনিক" নয় - এটি গুয়েডো বিশেষত সতর্ক করে বলেছে এবং এটি বুলিয়ান অপারেটরদের "অপব্যবহার" হিসাবে উল্লেখ করেছে।
অবধি

1
ওহ, আমি একমত - প্রশ্নটির অংশটি একটি লাইন পথের জন্য জিজ্ঞাসা করেছিল এবং এটিই প্রথম জিনিসটি যা আমার মাথায়
অ্যান্ডি জোনস

4
ঠিক আছে, আপনি কোলনের পরে কেবল নতুন লাইনটি সরিয়েও এটি একটি ওয়ান-লাইনার তৈরি করতে পারেন ... বা আরও ভাল, গাইড লোকজনকে "বুলিয়ান অপারেটরগুলি" ব্যবহার থেকে বিরত রাখতে ই-এক্সপ্রেশনটি সংক্ষেপে যুক্ত করেছিলেন এবং প্রমাণ করার দুর্দান্ত সুযোগ রয়েছে যে কোনও কিছুই আপত্তিজনক হতে পারে: os.remove ("gogogo.php") যদি os.path.exists ("gogogo.php") অন্য কোনও নয়। :)
অবার্নেট

0

একটি KISS অফার:

def remove_if_exists(filename):
  if os.path.exists(filename):
    os.remove(filename)

এবং তারপর:

remove_if_exists("my.file")

1
আপনাকে যদি পুরো ফাংশনটি লিখতে হয় তবে এটি একরকমের পয়েন্টগুলি মিস করে
আয়ন লেসান

@ আইয়ন লেসান ওপি হ'ল এই সমস্যাটি সমাধানের "সেরা" উপায়। এটি যদি পাঠযোগ্যতার ঝুঁকিতে ফেলে তবে একটি লাইনার আর কখনও ভাল উপায় নয়।
বাজ

"সেরা" এর অন্তর্নিহিত বিস্তৃত সংজ্ঞা দেওয়া, আমি এই অর্থে তর্ক করতে যাচ্ছি না, যদিও এটি স্পষ্টভাবে ট্যাকটিউ দ্বারা প্রভাবিত হয়েছে। এবং অবশ্যই একটি KISS সমাধান নয়।
অয়ন লেসান

@ ম্যাট ট্রু তবে এখানে প্রস্তাবিত বেশ কয়েকটি সমাধান কি এই সমস্যাটি থেকে ভুগছেন না?
বাজ

0

এটি অন্য একটি সমাধান:

if os.path.isfile(os.path.join(path, filename)):
    os.remove(os.path.join(path, filename))

0

ব্যতিক্রম হিসাবে আপনার নিজস্ব বার্তা সহ আরও একটি সমাধান।

import os

try:
    os.remove(filename)
except:
    print("Not able to delete the file %s" % filename)

-1

আমি ব্যবহার করেছি 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) ব্যবহার করতে পারি

সেফ-আরএম একটি সুরক্ষার সরঞ্জাম যা একটি আবরণ দিয়ে / বিন / আরএম প্রতিস্থাপনের মাধ্যমে গুরুত্বপূর্ণ ফাইলগুলির দুর্ঘটনাক্রমে মুছে ফেলা রোধ করে, যা ফাইল এবং ডিরেক্টরিগুলির একটি কনফিগারযোগ্য ব্ল্যাকলিস্টের বিরুদ্ধে প্রদত্ত যুক্তিগুলি পরীক্ষা করে যা কখনও অপসারণ করা উচিত নয়।

প্রথমে আমি ফোল্ডার / ফাইলের पथ বিদ্যমান কিনা তা পরীক্ষা করে দেখি। এটি চলক ফাইলটিও /সরানো ফোল্ডারটিওআরমোভ to the string-r / setting সেট করতে প্রতিরোধ করবে `


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]

1
এই তুচ্ছ কোনও কিছুর জন্য শেল ব্যবহার করা ওভারকিল এবং এই পদ্ধতিটি ক্রস-প্ল্যাটফর্ম (যেমন উইন্ডোজ) কাজ করবে না।
নাবলা

4
স্ট্যান্ডার্ড লাইব্রেরির পরিবর্তে একটি শেল ব্যবহার করা (উদাহরণস্বরূপ os.remove) সর্বদা কোনও কাজ করার ন্যূনতম / পরিষ্কার উপায়গুলির মধ্যে একটি। উদাহরণস্বরূপ আপনাকে শেল দ্বারা ফিরে আসা ত্রুটিগুলি ম্যানুয়ালি হ্যান্ডেল করতে হবে।
নাবলা

1
আমি আমার উত্তরটি rmনিরাপদে ব্যবহার এবং প্রতিরোধ করার জন্য যুক্ত করেছি rm -r /। @JonBrave
Alper

1
rm -f --preserve-rootযথেষ্ট ভাল না ( --preserve-rootসম্ভবত যাইহোক এটি ডিফল্ট)। আমি -r / উদাহরণ হিসাবে দিয়েছি , তা যদি হয় -r /homeবা যাই হোক না কেন? আপনি সম্ভবত চান rm -f -- $fileToRemove, কিন্তু এটি পয়েন্ট নয়।
জনব্রেভ

3
কোনও চলক নাম (পরিবেশের পরিবর্তনশীল), এবং কোনও উদ্ধৃতি, এবং কোনও সুরক্ষা, না সহ আপনি এটি যেভাবে ব্যবহার করেছেন তা নয়। এবং এই প্রশ্নের জন্য না, না। অযত্নের কাছে প্রকাশ os.system('rm ...')করা অত্যন্ত বিপজ্জনক, দুঃখিত।
জনব্রেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.