Вопрос: Как удалить файл или папку


Как удалить файл или папку в Python?


1403


источник


Ответы:


os.remove()удалит файл.

os.rmdir()удалит пустой каталог.

shutil.rmtree()удалит каталог и все его содержимое.


2267



Синтаксис 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 the file ##
try:
    os.remove(myfile)
except OSError, 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 

Синтаксис Python для удаления папки

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

75



использование

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

(См. Полную документацию по shutil ) и / или

os.remove

а также

os.rmdir

(Полная документация по Операционные системы .)


58



Для удаления файлов:

Вы можете использовать unlinkили remove,

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

Или

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

Эта функция удаляет (удаляет) путь к файлу. Если путь является каталогом, 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», если они пусты.


50



Создайте функцию для вас, ребята.

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

21



Вы можете использовать встроенный pathlibмодуль (требуется Python 3.4+, но есть резервные копии для более старых версий на 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()

15



How do I delete a file or folder in Python?

For Python 3, to remove the file and directory individually, use the unlink and rmdir Path object methods respectively:

from pathlib import Path
dir_path = Path.home() / 'directory' 
file_path = dir_path / 'file'

file_path.unlink() # remove file

dir_path.rmdir()   # remove directory

Note that you can also use relative paths with Path objects, and you can check your current working directory with Path.cwd.

For removing individual files and directories in Python 2, see the section so labeled below.

To remove a directory with contents, use shutil.rmtree, and note that this is available in Python 2 and 3:

from shutil import rmtree

rmtree(dir_path)

Demonstration

New in Python 3.4 is the Path object.

Let's use one to create a directory and file to demonstrate usage. Note that we use the / to join the parts of the path, this works around issues between operating systems and issues from using backslashes on Windows (where you'd need to either double up your backslashes like \\ or use raw strings, like 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()

and now:

>>> file_path.is_file()
True

Now let's delete them. First the file:

>>> file_path.unlink()     # remove file
>>> file_path.is_file()
False
>>> file_path.exists()
False

We can use globbing to remove multiple files - first let's create a few files for this:

>>> (directory_path / 'foo.my').touch()
>>> (directory_path / 'bar.my').touch()

Then just iterate over the glob pattern:

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

Now, demonstrating removing the directory:

>>> directory_path.rmdir() # remove directory
>>> directory_path.is_dir()
False
>>> directory_path.exists()
False

What if we want to remove a directory and everything in it? For this use-case, use shutil.rmtree

Let's recreate our directory and file:

file_path.parent.mkdir()
file_path.touch()

and note that rmdir fails unless it's empty, which is why rmtree is so convenient:

>>> 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'

Now, import rmtree and pass the directory to the funtion:

from shutil import rmtree
rmtree(directory_path)      # remove everything 

and we can see the whole thing has been removed:

>>> directory_path.exists()
False

Python 2

If you're on Python 2, there's a backport of the pathlib module called pathlib2, which can be installed with pip:

$ pip install pathlib2

And then you can alias the library to pathlib

import pathlib2 as pathlib

Or just directly import the Path object (as demonstrated here):

from pathlib2 import Path

If that's too much, you can remove files with os.remove or os.unlink

from os import unlink, remove
from os.path import join, expanduser

remove(join(expanduser('~'), 'directory/file'))

or

unlink(join(expanduser('~'), 'directory/file'))

and you can remove directories with os.rmdir:

from os import rmdir

rmdir(join(expanduser('~'), 'directory'))

Note that there is also a os.removedirs - it only removes empty directories recursively, but it may suit your use-case.


7



shutil.rmtree is the asynchronous function, so if you want to check when it complete, you can use while...loop

import os
import shutil

shutil.rmtree(path)

while os.path.exists(path):
  pass

print('done')

3



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)

2