উত্তর:
import os, shutil
folder = '/path/to/folder'
for filename in os.listdir(folder):
file_path = os.path.join(folder, filename)
try:
if os.path.isfile(file_path) or os.path.islink(file_path):
os.unlink(file_path)
elif os.path.isdir(file_path):
shutil.rmtree(file_path)
except Exception as e:
print('Failed to delete %s. Reason: %s' % (file_path, e))
except Exception as e:
পড়ার সাথে একটি পাইলট সতর্কতা পাচ্ছি W0703: Catching too general exception Exception
। ধরার জন্য আরও নির্দিষ্ট কোনও ব্যতিক্রম আছে বা আমার এড়িয়ে যাওয়া উচিত?
আপনি কেবল এটি করতে পারেন:
import os
import glob
files = glob.glob('/YOUR/PATH/*')
for f in files:
os.remove(f)
আপনি অবশ্যই আপনার পাথে অন্য ফিল্টারটি ব্যবহার করতে পারেন, উদাহরণস্বরূপ: /YOU/PATH/*.txt ডিরেক্টরিতে সমস্ত পাঠ্য ফাইল সরানোর জন্য।
*
লুকানো ফাইলগুলি তালিকাভুক্ত করবে না, আমাদের আরও যোগ করা উচিতglob.glob('path/.*)
import sh; sh.rm(files)
import sh; sh.rm(files)
দেখাতে না পারলে ডিরেক্টরিতে যদি 1024 এর বেশি ফাইল থাকে তবে আপনি সমস্যায় পড়বেন।
আপনি নিজেই ফোল্ডারটি এবং এর সমস্ত সামগ্রী মুছে ফেলতে পারেন shutil.rmtree
:
import shutil
shutil.rmtree('/path/to/folder')
shutil.rmtree(path, ignore_errors=False, onerror=None)
একটি সম্পূর্ণ ডিরেক্টরি গাছ মুছুন; পাথ অবশ্যই একটি ডিরেক্টরিতে নির্দেশ করবে (তবে কোনও ডিরেক্টরিতে প্রতীকী লিঙ্ক নয়)। যদি উপেক্ষা_ত্যাগগুলি সত্য হয় তবে ব্যর্থ অপসারণগুলির ফলে প্রাপ্ত ত্রুটিগুলি উপেক্ষা করা হবে; যদি মিথ্যা বা বাদ দেওয়া হয় তবে এই জাতীয় ত্রুটিগুলি অনাররারের দ্বারা নির্দিষ্ট একটি হ্যান্ডলারকে কল করে বা যদি এটি বাদ দেওয়া হয় তবে তারা একটি ব্যতিক্রম বাড়াবে।
rmtree
। লাইকos.makedirs(dir)
OSError: [Errno 16] Device or resource busy
মাওহকের জবাব প্রসারিত করা এটাই আমি বাস্তবায়ন করেছি। এটি কোনও ফোল্ডারের সমস্ত সামগ্রী সরিয়ে দেয় তবে ফোল্ডারটি নিজেই নয়। ফাইল, ফোল্ডার এবং প্রতীকী লিঙ্কগুলির সাথে লিনাক্সে পরীক্ষিত, উইন্ডোতেও কাজ করা উচিত।
import os
import shutil
for root, dirs, files in os.walk('/path/to/folder'):
for f in files:
os.unlink(os.path.join(root, f))
for d in dirs:
shutil.rmtree(os.path.join(root, d))
walk
ডায়ার বনাম ফাইলগুলি বিভক্ত করতে ব্যবহৃত হয়, যা অবশ্যই অন্যভাবে পরিচালনা করা উচিত। আপনি এটি ব্যবহার করতে পারেন os.listdir
, তবে আপনাকে অবশ্যই পরীক্ষা করতে হবে যে প্রতিটি এন্ট্রি ম্যানুয়ালি দির বা ফাইল রয়েছে কিনা।
os.walk
এখানে পুনরাবৃত্তি হবে না, কারণ এটি কোনও জেনারেটরকে ফেরত দেওয়ার চেষ্টা করার সময় কেবলমাত্র পুনরাবৃত্তভাবে সাব-ডাইরেক্টরিগুলিতে সন্ধান করে এবং আপনি যখন এই লুপটির প্রথম পুনরাবৃত্তিটি করেছেন তখন কোনও সাব-ডিরেক্টরি নেই দেখার জন্য বাম সংক্ষেপে, os.walk
এখানে কেবল শীর্ষ-স্তরের ফাইলগুলি থেকে শীর্ষ স্তরের ফোল্ডারগুলিকে আলাদা করার বিকল্প উপায় হিসাবে ব্যবহার করা হচ্ছে; পুনরাবৃত্তি ব্যবহৃত হচ্ছে না এবং আমরা এর জন্য কোনও কার্যকারিতা ব্যয় করি না। যদিও এটি উদ্ভট, এবং আমি সম্মত হই যে আপনার প্রস্তাবিত পদ্ধতিটি আরও ভাল কারণ এটি আরও স্পষ্ট এবং পাঠযোগ্য।
rmtree
ফোল্ডারটি ব্যবহার করা এবং পুনরুদ্ধার করা কাজ করতে পারে তবে নেটওয়ার্ক ড্রাইভে ফোল্ডারগুলি মুছে ফেলা এবং অবিলম্বে পুনরুদ্ধার করার সময় আমি ত্রুটিগুলিতে চলে এসেছি into
ওয়াক ব্যবহার করে প্রস্তাবিত সমাধানটি কাজ করে না কারণ এটি rmtree
ফোল্ডারগুলি অপসারণ করতে ব্যবহার os.unlink
করে এবং তারপরে এই ফোল্ডারে থাকা ফাইলগুলিতে ব্যবহারের চেষ্টা করতে পারে । এটি একটি ত্রুটি ঘটায়।
পোস্ট করা glob
সমাধান ত্রুটি সৃষ্টি করে, খালি-খালি ফোল্ডারগুলি মোছার চেষ্টা করবে।
আমি আপনাকে ব্যবহার করার পরামর্শ দিচ্ছি:
folder_path = '/path/to/folder'
for file_object in os.listdir(folder_path):
file_object_path = os.path.join(folder_path, file_object)
if os.path.isfile(file_object_path) or os.path.islink(file_object_path):
os.unlink(file_object_path)
else:
shutil.rmtree(file_object_path)
os.path.isfile()
ফিরে আসবে False
(কারণ এটি প্রতিলিঙ্ক অনুসরণ করে) এবং আপনি একটি সিমিলিংক ডাকবেন shutil.rmtree()
, যা উত্থাপন করবে OSError("Cannot call rmtree on a symbolic link")
।
islink
পরিচালনা করার জন্য এখানে একটি চেকের প্রয়োজনীয়তাটি সঠিকভাবে দেখানো ঠিক। আমি গ্রহণযোগ্য উত্তরে এ জাতীয় চেক যুক্ত করেছি।
এই:
কোড:
for filename in os.listdir(dirpath):
filepath = os.path.join(dirpath, filename)
try:
shutil.rmtree(filepath)
except OSError:
os.remove(filepath)
অন্যান্য অনেক উত্তর হিসাবে, এটি ফাইল / ডিরেক্টরিগুলি অপসারণ সক্ষম করার জন্য অনুমতিগুলি সামঞ্জস্য করার চেষ্টা করে না।
অনেলাইনার হিসাবে:
import os
# Python 2.7
map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
# Python 3+
list( map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) ) )
ফাইল এবং ডিরেক্টরিগুলির জন্য আরও শক্তিশালী সমাধান অ্যাকাউন্টিং হবে (২. 2.):
def rm(f):
if os.path.isdir(f): return os.rmdir(f)
if os.path.isfile(f): return os.unlink(f)
raise TypeError, 'must be either file or directory'
map( rm, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
list(map(os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir))))
map
মধ্যে list
আসলে পুনরুক্তি করতে। Http://stackoverflow.com/questions/1303347/getting-a-map-to-return-a-list-in-python-3-x
দ্রষ্টব্য: যদি কেউ আমার উত্তরটি ভোট দেয় তবে আমার এখানে কিছু ব্যাখ্যা করার দরকার আছে।
shutil.rmtree()
একটি ডিরেক্টরি ট্রি মুছতে ব্যবহৃত হতে পারে। আমি নিজের প্রকল্পে এটি বহুবার ব্যবহার করেছি। তবে আপনাকে অবশ্যই বুঝতে হবে যে ডিরেক্টরিটি নিজে থেকেও মুছে ফেলা হবেshutil.rmtree()
। এই কিছু গ্রহণযোগ্য হতে পারে, তাহলেও এটি জন্য একটি বৈধ উত্তর না একটি ফোল্ডার বিষয়বস্তু (পার্শ্ব প্রতিক্রিয়া ছাড়া) মুছে ফেলার ।shutil.rmtree()
এবং এটি দিয়ে পুনর্নির্মাণ করুন os.mkdir()
। এবং এর পরিবর্তে আপনি ডিফল্ট (উত্তরাধিকারসূত্রে) মালিক এবং মোড বিটের একটি খালি ডিরেক্টরি পাবেন । আপনার সামগ্রীতে এবং এমনকি ডিরেক্টরি মুছে ফেলার অধিকার থাকতে পারে, আপনি সম্ভবত ডিরেক্টরিতে মূল মালিক এবং মোড বিটগুলি সেট করতে সক্ষম নাও হতে পারেন (যেমন আপনি কোনও সুপারভাইজার নন)।এখানে একটি দীর্ঘ এবং কদর্য, তবে নির্ভরযোগ্য এবং দক্ষ সমাধান।
এটি কয়েকটি সমস্যা সমাধান করে যা অন্যান্য উত্তরদাতাদের দ্বারা সমাধান করা হয়নি:
shutil.rmtree()
একটি প্রতীকী লিঙ্কে কল না করা (যা os.path.isdir()
এটি কোনও ডিরেক্টরিতে লিঙ্ক করলে পরীক্ষাটি পাস করবে ; এমনকি ফলাফলের মধ্যেও os.walk()
প্রতীকী সংযুক্ত ডিরেক্টরি রয়েছে)।এখানে কোড (একমাত্র কার্যকর ফাংশনটি হ'ল clear_dir()
):
import os
import stat
import shutil
# http://stackoverflow.com/questions/1889597/deleting-directory-in-python
def _remove_readonly(fn, path_, excinfo):
# Handle read-only files and directories
if fn is os.rmdir:
os.chmod(path_, stat.S_IWRITE)
os.rmdir(path_)
elif fn is os.remove:
os.lchmod(path_, stat.S_IWRITE)
os.remove(path_)
def force_remove_file_or_symlink(path_):
try:
os.remove(path_)
except OSError:
os.lchmod(path_, stat.S_IWRITE)
os.remove(path_)
# Code from shutil.rmtree()
def is_regular_dir(path_):
try:
mode = os.lstat(path_).st_mode
except os.error:
mode = 0
return stat.S_ISDIR(mode)
def clear_dir(path_):
if is_regular_dir(path_):
# Given path is a directory, clear its content
for name in os.listdir(path_):
fullpath = os.path.join(path_, name)
if is_regular_dir(fullpath):
shutil.rmtree(fullpath, onerror=_remove_readonly)
else:
force_remove_file_or_symlink(fullpath)
else:
# Given path is a file or a symlink.
# Raise an exception here to avoid accidentally clearing the content
# of a symbolic linked directory.
raise OSError("Cannot call clear_dir() on a symbolic link")
os.remove
, অসদৃশrm
ইউটিলিটি, যতদিন আপনি সেগুলির মালিক হিসাবে শুধুমাত্র পাঠযোগ্য ফাইল মুছে দিন খুশি। এদিকে, এটি যদি এমন কোনও ফাইলের মালিকানা না থাকে যা কেবলমাত্র আপনার কেবলমাত্র পাঠ্য অ্যাক্সেসে রয়েছে তবে আপনি এটি মুছতে বা অনুমতিগুলি পরিবর্তন করতে পারবেন না । আমি এমন কোনও সিস্টেমে এমন কোনও পরিস্থিতি জানি না যেখানে আপনি কেবল পঠনযোগ্য ফাইল মুছতে সক্ষম হবেন না os.remove
তবে এর অনুমতিগুলি পরিবর্তন করতে সক্ষম হবেন। তদুপরি, আপনি ব্যবহার lchmod
করেন যা আমার ম্যাকে বা উইন্ডোজের ডক্স অনুসারে বিদ্যমান নেই। এই কোডটি কী প্ল্যাটফর্মের জন্য বোঝানো হয়েছে ?!
আমি অবাক হয়েছি কেউ pathlib
এই কাজটি করার জন্য দুর্দান্তটির কথা উল্লেখ করেনি ।
আপনি যদি কেবল একটি ডিরেক্টরিতে ফাইলগুলি সরাতে চান তবে এটি অনলাইনার হতে পারে
from pathlib import Path
[f.unlink() for f in Path("/path/to/folder").glob("*") if f.is_file()]
পুনরাবৃত্তভাবে ডিরেক্টরিগুলি মুছে ফেলার জন্য আপনি এরকম কিছু লিখতে পারেন:
from pathlib import Path
from shutil import rmtree
for path in Path("/path/to/folder").glob("**/*"):
if path.is_file():
path.unlink()
elif path.is_dir():
rmtree(path)
.iterdir()
পরিবর্তে .glob(...)
এছাড়াও কাজ করা উচিত।
import os
import shutil
# Gather directory contents
contents = [os.path.join(target_dir, i) for i in os.listdir(target_dir)]
# Iterate and remove each item in the appropriate manner
[os.remove(i) if os.path.isfile(i) or os.path.islink(i) else shutil.rmtree(i) for i in contents]
পূর্বের একটি মন্তব্যে পাইথন 3.5++ এ os.scandir ব্যবহার করার কথাও বলা হয়েছে। উদাহরণ স্বরূপ:
import os
import shutil
with os.scandir(target_dir) as entries:
for entry in entries:
if entry.is_file() or entry.is_symlink():
os.remove(entry.path)
elif entry.is_dir():
shutil.rmtree(entry.path)
os.path.isdir()
নিয়মিত ডিরেক্টরি এবং একটি প্রতীকী লিঙ্কের মধ্যে পার্থক্য করার কোনও বৈধ উপায় নয়। shutil.rmtree()
প্রতীকী লিঙ্কে কল করা OSError
ব্যতিক্রম বাড়িয়ে তুলবে ।
আপনি এটি ব্যবহার করে ভাল হতে পারে os.walk()
।
os.listdir()
ডিরেক্টরিগুলি থেকে ফাইলগুলি পৃথক করে না এবং এগুলি লিঙ্কমুক্ত করার চেষ্টা করে আপনি দ্রুত সমস্যায় পড়বেন। সেখানে ব্যবহারের একটি ভাল উদাহরণ os.walk()
যাও recursively একটি ডিরেক্টরি মুছে ফেলার জন্য এখানে কিভাবে আপনার পরিস্থিতিতে এটা মানিয়ে উপর নির্দেশ, এবং।
আমি এইভাবে সমস্যার সমাধান করতাম:
import shutil
import os
shutil.rmtree(dirpath)
os.mkdir(dirpath)
তবুও আরেকটি সমাধান:
import sh
sh.rm(sh.glob('/path/to/folder/*'))
sh
স্ট্যান্ডার্ড লাইব্রেরির অংশ নয় এবং এটি ব্যবহারের আগে পিপিআই থেকে ইনস্টল করা দরকার। এছাড়াও, যেহেতু এটি প্রকৃতপক্ষে rm
একটি উপ-প্রসেসে আহ্বান জানায় , এটি উইন্ডোতে কাজ করবে না যেখানে rm
অস্তিত্ব নেই। যদি ফোল্ডারে কোনও উপ-ডিরেক্টরি থাকে তবে এটি একটি ব্যতিক্রমও বাড়িয়ে তুলবে।
আমি জানতাম এটি একটি পুরানো থ্রেড তবে পাইথনের অফিসিয়াল সাইট থেকে আমি আকর্ষণীয় কিছু পেয়েছি। কোনও ডিরেক্টরিতে সমস্ত সামগ্রী মুছে ফেলার জন্য অন্য একটি ধারণা ভাগ করার জন্য sharing কারণ shutil.rmtree () ব্যবহার করার সময় আমার অনুমোদনের কিছু সমস্যা রয়েছে এবং আমি ডিরেক্টরিটি সরিয়ে আবার এটি পুনরায় তৈরি করতে চাই না। ঠিকানাটি মূল http://docs.python.org/2/library/os.html#os.walk । আশা করি যে কাউকে সাহায্য করতে পারে।
def emptydir(top):
if(top == '/' or top == "\\"): return
else:
for root, dirs, files in os.walk(top, topdown=False):
for name in files:
os.remove(os.path.join(root, name))
for name in dirs:
os.rmdir(os.path.join(root, name))
ডিরেক্টরিগুলির ভিতরে থাকা সমস্ত ফাইল এবং উপ-ডিরেক্টরিগুলি মুছে ফেলার জন্য, ফোল্ডারগুলি নিজেরাই সরিয়ে না দিয়ে কেবল এটি করুন:
import os
mypath = "my_folder" #Enter your path here
for root, dirs, files in os.walk(mypath):
for file in files:
os.remove(os.path.join(root, file))
আপনি যদি * নিক্স সিস্টেম ব্যবহার করে থাকেন তবে সিস্টেম কমান্ডটি কেন উপস্থাপন করবেন না?
import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)
আমাকে একটি একক পিতামাতার ডিরেক্টরিতে 3 পৃথক ফোল্ডার থেকে ফাইলগুলি সরিয়ে ফেলতে হয়েছিল:
directory
folderA
file1
folderB
file2
folderC
file3
এই সহজ কোডটি আমার জন্য কৌশলটি করেছে: (আমি ইউনিক্সে আছি)
import os
import glob
folders = glob.glob('./path/to/parentdir/*')
for fo in folders:
file = glob.glob(f'{fo}/*')
for f in file:
os.remove(f)
আশাকরি এটা সাহায্য করবে.
একটি সীমাবদ্ধ, নির্দিষ্ট পরিস্থিতির জন্য উত্তর: ধরে নিচ্ছেন সাব-ফোল্ডার গাছ বজায় রাখার সময় আপনি ফাইলগুলি মুছতে চান, আপনি পুনরাবৃত্তির অ্যালগোরিদম ব্যবহার করতে পারেন:
import os
def recursively_remove_files(f):
if os.path.isfile(f):
os.unlink(f)
elif os.path.isdir(f):
for fi in os.listdir(f):
recursively_remove_files(os.path.join(f, fi))
recursively_remove_files(my_directory)
সম্ভবত সামান্য অফ-টপিক, তবে আমি মনে করি এটি অনেকের পক্ষে দরকারী হবে
os.walk
ভাবে দেখানো মধ্যে stackoverflow.com/a/54889532/1709587 সম্ভবত যখন ডিরেক্টরি গঠন অক্ষত রেখে সমস্ত ফাইল মুছে একটি সুন্দর উপায়।
temp_dir
মুছে ফেলা হচ্ছে বলে ধরে os
নিলে , একটি একক লাইন কমান্ডটি হ'ল :
_ = [os.remove(os.path.join(save_dir,i)) for i in os.listdir(temp_dir)]
দ্রষ্টব্য: এটি ফাইল মুছে ফেলার জন্য কেবল 1-লাইনার 'ডিরেক্টরিগুলি মুছবে না।
আশাকরি এটা সাহায্য করবে. ধন্যবাদ।
ডিরেক্টরিটি নয়, কোনও ডিরেক্টরিতে থাকা বিষয়বস্তু সরিয়ে ফেলতে পদ্ধতিটি বেলোটি ব্যবহার করুন:
import os
import shutil
def remove_contents(path):
for c in os.listdir(path):
full_path = os.path.join(path, c)
if os.path.isfile(full_path):
os.remove(full_path)
else:
shutil.rmtree(full_path)
os.system('rm -rf folder')