Jak usunąć plik lub folder?

Odpowiedzi:

3341

Pathobiekty z modułu Python 3.4+ pathlibujawniają również następujące metody instancji:

RichieHindle
źródło
5
os.rmdir () w systemie Windows usuwa również symboliczne łącze do katalogu, nawet jeśli katalog docelowy nie jest pusty
Lu55
8
Jeśli plik nie istnieje, os.remove()zgłasza wyjątek, więc może być konieczne sprawdzenie os.path.isfile()najpierw lub zawinięcie w try.
Ben Crowell
2
Chciałbym, aby Path.unlink 1 / był rekurencyjny 2 / dodać opcję ignorowania FileNotfoundError.
Jérôme,
7
tylko dla zakończenia ... wyjątek zgłaszany, os.remove()jeśli plik nie istnieje FileNotFoundError.
PedroA
Czy os.remove() potrzeba wielu argumentów, aby usunąć wiele plików, czy wywołujesz go za każdym razem dla każdego pliku?
user742864
291

Składnia Python, aby usunąć plik

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

Lub

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

Lub

biblioteka pathlib dla wersji Python> 3.5

file_to_rem = pathlib.Path("/tmp/<file_name>.txt")
file_to_rem.unlink()

Path.unlink (missing_ok = False)

Metoda rozłączenia użyta do usunięcia pliku lub łącza symbolik.

Jeśli brak_ok jest fałszywy (domyślnie), FileNotFoundError jest wywoływany, jeśli ścieżka nie istnieje.
Jeśli brak_ok jest prawdą, wyjątki FileNotFoundError zostaną zignorowane (to samo zachowanie, co w przypadku polecenia rm -f POSIX).
Zmieniono w wersji 3.8: Dodano parametr missing_ok.

Najlepsze praktyki

  1. Najpierw sprawdź, czy plik lub folder istnieje, czy nie tylko usuń ten plik. Można to osiągnąć na dwa sposoby:
    a. os.path.isfile("/path/to/file")
    b. Posługiwać sięexception handling.

PRZYKŁAD dlaos.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)

Obsługa wyjątków

#!/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 as e:  ## if failed, report it back to the user ##
    print ("Error: %s - %s." % (e.filename, e.strerror))

ODPOWIEDNIE WYDAJNOŚĆ

Wpisz nazwę pliku do usunięcia: demo.txt
Błąd: demo.txt - Brak takiego pliku lub katalogu.

Wpisz nazwę pliku do usunięcia: rrr.txt
Błąd: rrr.txt - Operacja niedozwolona.

Wpisz nazwę pliku do usunięcia: foo.txt

Składnia Python, aby usunąć folder

shutil.rmtree()

Przykład dla 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 as e:
    print ("Error: %s - %s." % (e.filename, e.strerror))
anand tripathi
źródło
13
Obsługa sprawdzania wyjątków jest zalecana zamiast sprawdzania, ponieważ plik można usunąć lub zmienić między dwiema liniami (TOCTOU: en.wikipedia.org/wiki/Time_of_check_to_time_of_use ) Patrz dokumentacja Python FAQ docs.python.org/3/glossary.html#term-eafp
Éric Araujo
84

Posługiwać się

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

(Zobacz pełną dokumentację dotyczącą shutil ) i / lub

os.remove

i

os.rmdir

(Pełna dokumentacja na os .)

Mihai Maruseac
źródło
6
Dodaj interfejs pathlib (nowy od Pythona 3.4) do listy.
Paebbels,
38

Tutaj jest solidnym funkcja, która wykorzystuje zarówno os.removea shutil.rmtree:

def remove(path):
    """ param <path> could either be relative or absolute. """
    if os.path.isfile(path) or os.path.islink(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))
flycee
źródło
8
Tj. 8 linii kodu do symulacji remove(path);wywołania ISO C.
Kaz
2
@Kaz zgodził się denerwujący, ale czy usuwa umowę z drzewami? :-)
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
5
os.path.islink(file_path): błąd powinien byćos.path.islink(path):
Neo li
32

Można użyć wbudowanego pathlibmodułu (wymaga Python 3.4+, ale istnieją backporty dla starszych wersji na PyPI: pathlib, pathlib2).

Aby usunąć plik, istnieje unlinkmetoda:

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

Lub rmdirmetoda usunięcia pustego folderu:

import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()
MSeifert
źródło
2
A co z niepustym katalogiem?
Pranasas,
@Pranasas Niestety wydaje się, że nie ma nic (natywnie) w pathlibtym, co mogłoby poradzić sobie z usuwaniem niepustych katalogów. Jakkolwiek możesz użyć shutil.rmtree. Zostało to wspomniane w kilku innych odpowiedziach, więc go nie uwzględniłem.
MSeifert,
29

Jak usunąć plik lub folder w Pythonie?

W przypadku Python 3, aby usunąć plik i katalog indywidualnie, użyj odpowiednio metod unlinki object: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

Zauważ, że możesz również używać ścieżek względnych z Pathobiektami i możesz sprawdzić swój bieżący katalog roboczy za pomocą Path.cwd.

Aby usunąć poszczególne pliki i katalogi w Pythonie 2, zobacz sekcję oznaczoną poniżej.

Aby usunąć katalog z zawartością, użyj shutil.rmtreei zwróć uwagę, że jest on dostępny w Python 2 i 3:

from shutil import rmtree

rmtree(dir_path)

Demonstracja

Nowością w Pythonie 3.4 jest Pathobiekt.

Użyjmy jednego, aby utworzyć katalog i plik, aby zademonstrować użycie. Zauważ, że używamy /do łączenia części ścieżki, to rozwiązuje problemy między systemami operacyjnymi i problemy z używaniem odwrotnych ukośników w systemie Windows (gdzie musisz albo podwoić swoje odwrotne ukośniki jak \\lub użyć nieprzetworzonych ciągów, takich jak 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()

i teraz:

>>> file_path.is_file()
True

Teraz usuńmy je. Najpierw plik:

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

Możemy użyć globowania do usunięcia wielu plików - najpierw utwórzmy kilka plików:

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

Następnie po prostu powtórz wzór globalny:

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

Teraz demonstruję usunięcie katalogu:

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

Co jeśli chcemy usunąć katalog i wszystko w nim zawarte? W tym przypadku użycia użyjshutil.rmtree

Utwórzmy ponownie nasz katalog i plik:

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

i zauważ, rmdirże to się nie powiedzie, chyba że jest puste, dlatego rmtree jest tak wygodny:

>>> 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/username/directory'

Teraz zaimportuj rmtree i przekaż katalog do funkcji:

from shutil import rmtree
rmtree(directory_path)      # remove everything 

i widzimy, że całość została usunięta:

>>> directory_path.exists()
False

Python 2

Jeśli korzystasz z Python 2, istnieje backport modułu pathlib o nazwie pathlib2 , który można zainstalować za pomocą pip:

$ pip install pathlib2

Następnie możesz aliasować bibliotekę do pathlib

import pathlib2 as pathlib

Lub po prostu zaimportuj bezpośrednio Pathobiekt (jak pokazano tutaj):

from pathlib2 import Path

Jeśli to za dużo, możesz usunąć pliki za pomocą os.removelubos.unlink

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

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

lub

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

i możesz usunąć katalogi za pomocą os.rmdir:

from os import rmdir

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

Zauważ, że jest też os.removedirs- usuwa rekursywnie tylko puste katalogi, ale może pasować do twojego przypadku użycia.

Aaron Hall
źródło
rmtree(directory_path)działa w Pythonie 3.6.6, ale nie w Pythonie 3.5.2 - rmtree(str(directory_path)))tam potrzebujesz .
Stein
4
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)
Lalithesh
źródło
1
Spowoduje to usunięcie tylko plików w folderze i podfolderach, pozostawiając nienaruszoną strukturę folderów.
Lalithesh
4

shutil.rmtree to funkcja asynchroniczna, więc jeśli chcesz sprawdzić, kiedy się zakończy, możesz użyć pętli while ...

import os
import shutil

shutil.rmtree(path)

while os.path.exists(path):
  pass

print('done')
m0z4rt
źródło
1
shutil.rmtreenie powinien być asynchroniczny. Może się jednak wydawać, że działa w systemie Windows z zakłóceniami ze strony skanerów antywirusowych.
mhsmith,
@mhsmith Skanery wirusów ? Czy to dzikie spekulacje, czy rzeczywiście wiesz, że mogą powodować ten efekt? Jak do diabła to działa, jeśli tak?
Mark Amery
2

Aby usunąć pliki:

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

lub

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

Obie funkcje są semantycznie takie same. Ta funkcja usuwa (usuwa) ścieżkę pliku. Jeśli ścieżka nie jest plikiem i jest katalogiem, zgłaszany jest wyjątek.

Aby usunąć foldery:

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

lub

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

Aby usunąć całe drzewa katalogów, shutil.rmtree()można użyć.os.rmdirdziała tylko wtedy, gdy katalog jest pusty i istnieje.

Aby rekurencyjnie usuwać foldery w kierunku rodzica:

os.removedirs(name)

Usuwa każdy pusty katalog nadrzędny z self, aż nadrzędny, który ma jakąś zawartość

dawny. os.removedirs ('abc / xyz / pqr') usunie katalogi poprzez zamówienie 'abc / xyz / pqr', 'abc / xyz' i 'abc', jeśli są puste.

Aby uzyskać więcej informacji sprawdź oficjalny dokument: os.unlink, os.remove,os.rmdir , shutil.rmtree,os.removedirs

Somnath Muluk
źródło
1

Aby usunąć wszystkie pliki z folderu

import os
import glob

files = glob.glob(os.path.join('path/to/folder/*'))
files = glob.glob(os.path.join('path/to/folder/*.csv')) // It will give all csv files in folder
for file in files:
    os.remove(file)

Aby usunąć wszystkie foldery z katalogu

from shutil import rmtree
import os

// os.path.join()  # current working directory.

for dirct in os.listdir(os.path.join('path/to/folder')):
    rmtree(os.path.join('path/to/folder',dirct))
Sarender Reddy
źródło
0

Aby uniknąć problemu TOCTOU podkreślonego w komentarzu Érica Araujo , możesz złapać wyjątek, aby wywołać prawidłową metodę:

def remove_file_or_dir(path: str) -> None:
    """ Remove a file or directory """
    try:
        shutil.rmtree(path)
    except NotADirectoryError:
        os.remove(path)

Ponieważ shutil.rmtree()usunie tylko katalogi i os.remove()lub os.unlink()usunie tylko pliki.

Isaac Turner
źródło
shutil.rmtree()usuwa nie tylko katalog, ale także jego zawartość.
Tiago Martins Peres
-1

Polecam używać, subprocessjeśli piszesz piękny i czytelny kod, który jest twoją filiżanką herbaty:

import subprocess
subprocess.Popen("rm -r my_dir", shell=True)

A jeśli nie jesteś inżynierem oprogramowania, możesz rozważyć użycie Jupyter; możesz po prostu wpisać polecenia bash:

!rm -r my_dir

Tradycyjnie używasz shutil:

import shutil
shutil.rmtree(my_dir) 
Milady
źródło
3
Podproces jest praktyką, której należy unikać
zwiał
3
Nie poleciłbym subprocesstego. shutil.rmtreedziała rm -rdobrze, z dodatkową zaletą pracy w systemie Windows.
Mark Amery