python - كيفية حذف ملف أو مجلد؟




file-io folder delete-file (9)

كيف يمكنني حذف ملف أو مجلد في Python؟

بالنسبة إلى Python 3 ، لإزالة الملف والدليل بشكل فردي ، استخدم أساليب كائن pathlib.Path.unlink pathlib.Path.rmdir و pathlib.Path.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 .

لإزالة الملفات والأدلة الفردية في Python 2 ، راجع القسم المسمى أدناه.

لإزالة دليل يحتوي على محتويات ، استخدم shutil.rmtree ، ولاحظ أن هذا متاح في Python 2 و 3:

from shutil import rmtree

rmtree(dir_path)

برهنة

جديد في Python 3.4 هو كائن Path .

دعونا نستخدم واحدة لإنشاء دليل وملف لإثبات الاستخدام. لاحظ أننا نستخدم / للانضمام إلى أجزاء المسار ، وهذا يعمل على حل المشكلات بين أنظمة التشغيل والمشكلات من استخدام الخطوط المائلة العكسية على Windows (حيث تحتاج إلى مضاعفة الخطوط الخلفية مثل \\ أو استخدام سلاسل raw ، مثل 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

يمكننا استخدام globing لإزالة ملفات متعددة - أولاً دعنا ننشئ بعض الملفات لهذا:

>>> (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/excelsiora/directory'

الآن ، استيراد rmtree وتمرير الدليل إلى funtion:

from shutil import rmtree
rmtree(directory_path)      # remove everything 

ويمكننا رؤية ما تم إزالته بالكامل:

>>> directory_path.exists()
False

بايثون 2

إذا كنت على Python 2 ، فهناك pathlib2 ، والتي يمكن تثبيتها 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 - أنه يزيل فقط الدلائل الفارغة بشكل متكرر ، ولكن قد تتناسب مع حالة الاستخدام الخاصة بك.

كيف يمكنني حذف ملف أو مجلد في Python؟


بناء جملة Python لحذف ملف

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

أو

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

افضل تمرين:
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 file ##
try:
    os.remove(myfile)
except OSError, e:  ## if failed, report it back to the user ##
    print ("Error: %s - %s." % (e.filename,e.strerror))

RESPECTIVE OUTPUT

Enter file name to delete : demo.txt
Error: demo.txt - No such file or directory.

Enter file name to delete : rrr.txt
Error: rrr.txt - Operation not permitted.

Enter file name to delete : foo.txt 

بناء جملة Python لحذف مجلد

shutil.rmtree()

مثال على shutil.rmtree()

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

# Get dir 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, e:
    print ("Error: %s - %s." % (e.filename,e.strerror))

يمكنك استخدام وحدة pathlib (يتطلب Python 3.4+ ، ولكن هناك backports للإصدارات الأقدم على PyPI: pathlib ، pathlib2 ).

لإزالة ملف هناك طريقة unlink :

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

أو طريقة rmdir لإزالة مجلد فارغ :

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

shutil.rmtree هي الوظيفة غير المتزامنة ، لذا إذا أردت التحقق عند اكتمالها ، فيمكنك استخدامها أثناء ... حلقة

import os
import shutil

shutil.rmtree(path)

while os.path.exists(path):
  pass

print('done')

خلق وظيفة لك يا رفاق.

def remove(path):
    """ param <path> could either be relative or absolute. """
    if os.path.isfile(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))

استعمال

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

(انظر الوثيقة كاملة على shutil ) و / أو

os.remove

و

os.rmdir

(وثيقة كاملة على os.remove() )


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)

لحذف الملفات:

يمكنك استخدام unlink أو remove .

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

أو

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

تعمل هذه الوظائف على إزالة (حذف) مسار الملف. إذا كان المسار عبارة عن دليل ، OSError رفع OSError .

في Python 2 ، إذا كان المسار غير موجود ، يتم OSError مع [Errno 2] ( ENOENT ). في Python 3 ، يتم رفع FileNotFoundError بـ [Errno 2] ( ENOENT ). في Python 3 ، نظرًا لأن FileNotFoundError عبارة عن فئة فرعية من OSError ، فإن التقاط هذا الأخير سيؤدي إلى التقاط الصورة السابقة.

لحذف المجلدات:

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

rmdir إزالة (حذف) مسار الدليل. يعمل فقط عندما يكون الدليل فارغًا ، وإلا ، يتم رفع OSError . لإزالة أشجار الدليل بالكامل ، يمكن استخدام shutil.rmtree() .

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

shutil.rmtree حذف شجرة دليل كاملة. يجب أن يشير المسار إلى دليل (لكن ليس رابطًا رمزيًا إلى دليل).

إذا كان ignore_errors صحيحًا ، فسيتم تجاهل الأخطاء الناتجة عن عمليات الإزالة الفاشلة ، وفي حالة الخطأ أو الحذف ، يتم التعامل مع هذه الأخطاء عن طريق استدعاء معالج محدد بواسطة onerror أو ، إذا تم حذفها ، فإنها تثير استثناءً.

أنظر أيضا:

os.removedirs(name)

os.removedirs(name) إزالة الدلائل بشكل متكرر. يعمل مثل rmdir () فيما عدا ذلك ، إذا تمت إزالة دليل الورقة بنجاح ، يحاول removeirs () إزالة كل دليل رئيسي مذكور في المسار على التوالي حتى يتم رفع الخطأ (الذي يتم تجاهله ، لأنه يعني بشكل عام أن الدليل الرئيسي ليس فارغًا ).

على سبيل المثال ، يقوم os.removedirs ('foo / bar / baz') أولاً بإزالة الدليل 'foo / bar / baz' ، ثم إزالة 'foo / bar' و 'foo' إذا كانت فارغة.


أود أن أوصي شخصيا أن تستخدم os.path.isdir() لاختبار بدلا من os.path.exists() .

>>> os.path.exists('/tmp/dirname')
True
>>> os.path.exists('/tmp/dirname/filename.etc')
True
>>> os.path.isdir('/tmp/dirname/filename.etc')
False
>>> os.path.isdir('/tmp/fakedirname')
False

اذا كنت تمتلك:

>>> dir = raw_input(":: ")

وإدخال المستخدم أحمق:

:: /tmp/dirname/filename.etc

... أنت ذاهب لنهاية مع دليل يدعى filename.etc عند تمرير هذه الوسيطة إلى os.makedirs() إذا قمت بإجراء اختبار مع os.path.exists() .







python file-io folder delete-file