Bagaimana cara menghapus file atau folder?

Jawaban:

3347

Pathobjek dari pathlibmodul Python 3.4+ juga mengekspos metode instance ini:

RichieHindle
sumber
5
os.rmdir () di Windows juga menghapus tautan simbolis direktori bahkan jika direktori target tidak kosong
Lu55
8
Jika file tidak ada, berikan os.remove()pengecualian, jadi mungkin perlu untuk memeriksa os.path.isfile()dulu, atau membungkusnya dengan try.
Ben Crowell
2
Saya berharap Path.unlink 1 / bersifat rekursif 2 / tambahkan opsi untuk mengabaikan FileNotfoundError.
Jérôme
7
hanya untuk menyelesaikan ... pengecualian dilemparkan oleh os.remove()jika file tidak ada adalah FileNotFoundError.
PedroA
Apakah os.remove() diperlukan beberapa argumen untuk menghapus banyak file, atau Anda menyebutnya setiap kali untuk setiap file?
user742864
292

Sintaks Python untuk menghapus file

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

Atau

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

Atau

pathlib Library untuk versi Python> 3.5

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

Path.unlink (missing_ok = Salah)

Metode unlink digunakan untuk menghapus file atau tautan simbolik.

Jika missing_ok salah (default), FileNotFoundError dinaikkan jika jalur tidak ada.
Jika missing_ok benar, pengecualian FileNotFoundError akan diabaikan (perilaku yang sama dengan perintah POSIX rm -f).
Diubah dalam versi 3.8: Parameter missing_ok ditambahkan.

Praktek terbaik

  1. Pertama, periksa apakah file atau folder itu ada atau tidak, maka hapus saja file itu. Ini dapat dicapai dengan dua cara:
    a. os.path.isfile("/path/to/file")
    b. Menggunakanexception handling.

CONTOH untukos.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)

Penanganan Eksepsi

#!/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))

OUTPUT RESPEKTIF

Masukkan nama file untuk dihapus: demo.txt
Kesalahan: demo.txt - Tidak ada file atau direktori tersebut.

Masukkan nama file untuk dihapus: rrr.txt
Kesalahan: rrr.txt - Operasi tidak diizinkan.

Masukkan nama file untuk dihapus: foo.txt

Sintaks Python untuk menghapus folder

shutil.rmtree()

Contoh untuk 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
sumber
13
Penanganan pengecualian direkomendasikan untuk memeriksa karena file dapat dihapus atau diubah di antara dua baris (TOCTOU: en.wikipedia.org/wiki/Time_of_check_to_time_of_use ) Lihat Python FAQ docs.python.org/3/glossary.html#term-eafp
Éric Araujo
84

Menggunakan

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

(Lihat dokumentasi lengkap tentang shutil ) dan / atau

os.remove

dan

os.rmdir

(Dokumentasi lengkap di os .)

Mihai Maruseac
sumber
6
Silakan tambahkan antarmuka pathlib (baru sejak Python 3.4) ke daftar Anda.
Paebbels
38

Berikut adalah fungsi yang kuat yang menggunakan keduanya os.removedan 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
sumber
8
Yakni 8 baris kode untuk mensimulasikan remove(path);panggilan ISO C.
Kaz
2
@ Ka setuju menyebalkan, tetapi apakah menghapus kesepakatan dengan pohon? :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
6
os.path.islink(file_path): bug, harusos.path.islink(path):
Neo li
32

Anda dapat menggunakan built-in pathlibmodul (membutuhkan Python 3.4+, tetapi ada backports untuk versi yang lebih tua di PyPI: pathlib, pathlib2).

Untuk menghapus file ada unlinkmetode:

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

Atau rmdirmetode untuk menghapus folder kosong :

import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()
MSeifert
sumber
2
Bagaimana dengan direktori yang tidak kosong?
Pranasas
@Pranasas Sayangnya sepertinya tidak ada (asli) di pathlibyang dapat menangani menghapus direktori yang tidak kosong. Namun Anda bisa menggunakannya shutil.rmtree. Itu telah disebutkan dalam beberapa jawaban lain jadi saya belum memasukkannya.
MSeifert
30

Bagaimana cara menghapus file atau folder dengan Python?

Untuk Python 3, untuk menghapus file dan direktori secara individual, gunakan metode unlinkdan objek masing-masing: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

Perhatikan bahwa Anda juga dapat menggunakan jalur relatif dengan Pathobjek, dan Anda dapat memeriksa direktori kerja Anda saat ini dengan Path.cwd.

Untuk menghapus file dan direktori individual di Python 2, lihat bagian yang berlabel di bawah ini.

Untuk menghapus direktori dengan konten, gunakan shutil.rmtree, dan perhatikan bahwa ini tersedia dalam Python 2 dan 3:

from shutil import rmtree

rmtree(dir_path)

Demonstrasi

Baru dalam Python 3.4 adalah Pathobjek.

Mari kita gunakan satu untuk membuat direktori dan file untuk menunjukkan penggunaan. Perhatikan bahwa kami menggunakan /untuk bergabung dengan bagian-bagian jalan, ini mengatasi masalah antara sistem operasi dan masalah dari penggunaan backslash pada Windows (di mana Anda perlu menggandakan backslash Anda seperti \\atau menggunakan string mentah, seperti 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()

dan sekarang:

>>> file_path.is_file()
True

Sekarang mari kita hapus. Pertama file:

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

Kita dapat menggunakan globbing untuk menghapus banyak file - pertama mari kita buat beberapa file untuk ini:

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

Kemudian hanya mengulangi pola glob:

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

Sekarang, menunjukkan penghapusan direktori:

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

Bagaimana jika kita ingin menghapus direktori dan semua yang ada di dalamnya? Untuk kasus penggunaan ini, gunakanshutil.rmtree

Mari kita buat kembali direktori dan file kita:

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

dan perhatikan bahwa rmdirgagal kecuali itu kosong, itulah sebabnya rmtree sangat nyaman:

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

Sekarang, impor rmtree dan kirimkan direktori ke funtion:

from shutil import rmtree
rmtree(directory_path)      # remove everything 

dan kita bisa melihat semuanya telah dihapus:

>>> directory_path.exists()
False

Python 2

Jika Anda menggunakan Python 2, ada backport dari modul pathlib bernama pathlib2 , yang dapat diinstal dengan pip:

$ pip install pathlib2

Dan kemudian Anda bisa alias perpustakaan untuk pathlib

import pathlib2 as pathlib

Atau langsung saja mengimpor Pathobjek (seperti yang ditunjukkan di sini):

from pathlib2 import Path

Jika terlalu banyak, Anda dapat menghapus file dengan os.removeatauos.unlink

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

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

atau

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

dan Anda dapat menghapus direktori dengan os.rmdir:

from os import rmdir

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

Perhatikan bahwa ada juga os.removedirs- hanya menghapus direktori kosong secara rekursif, tetapi mungkin sesuai dengan kasus penggunaan Anda.

Aaron Hall
sumber
rmtree(directory_path)bekerja dalam python 3.6.6 tetapi tidak dalam python 3.5.2 - Anda perlu di rmtree(str(directory_path)))sana
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
sumber
1
Ini hanya akan menghapus file di dalam folder dan subfolder yang membuat struktur folder tetap utuh ..
Lalithesh
4

shutil.rmtree adalah fungsi asinkron, jadi jika Anda ingin memeriksa kapan itu selesai, Anda dapat menggunakan while ... loop

import os
import shutil

shutil.rmtree(path)

while os.path.exists(path):
  pass

print('done')
m0z4rt
sumber
1
shutil.rmtreetidak seharusnya tidak sinkron. Namun, ini mungkin tampak berada di Windows dengan pemindai virus mengganggu.
mhsmith
Pemindai virus @mhsmith ? Apakah itu spekulasi liar, atau apakah Anda benar-benar tahu bahwa mereka dapat menyebabkan efek ini? Bagaimana bisa kalau itu berhasil?
Mark Amery
2

Untuk menghapus file:

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

atau

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

Kedua fungsi secara semantik sama. Fungsi ini menghapus (menghapus) jalur file. Jika path bukan file dan itu adalah direktori, maka pengecualian dimunculkan.

Untuk menghapus folder:

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

atau

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

Untuk menghapus seluruh pohon direktori, shutil.rmtree()dapat digunakan. os.rmdirhanya berfungsi ketika direktori kosong dan ada.

Untuk menghapus folder secara rekursif ke arah induk:

os.removedirs(name)

Itu menghapus setiap direktori induk kosong dengan diri sampai induk yang memiliki beberapa konten

ex. os.removedirs ('abc / xyz / pqr') akan menghapus direktori dengan memesan 'abc / xyz / pqr', 'abc / xyz' dan 'abc' jika kosong.

Untuk info lebih lanjut cek doc resmi: os.unlink, os.remove, os.rmdir, shutil.rmtree,os.removedirs

Somnath Muluk
sumber
1

Untuk menghapus semua file di folder

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)

Untuk menghapus semua folder dalam direktori

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

Untuk menghindari masalah TOCTOU yang disorot oleh komentar Éric Araujo , Anda dapat menangkap pengecualian untuk memanggil metode yang benar:

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

Karena shutil.rmtree()hanya akan menghapus direktori dan os.remove()atau os.unlink()hanya akan menghapus file.

Isaac Turner
sumber
shutil.rmtree()menghapus tidak hanya direktori tetapi juga isinya.
Tiago Martins Peres 李大仁
-1

Saya sarankan menggunakan subprocessjika menulis kode yang indah dan mudah dibaca adalah secangkir teh Anda:

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

Dan jika Anda bukan seorang insinyur perangkat lunak, maka mungkin pertimbangkan untuk menggunakan Jupyter; Anda cukup mengetik perintah bash:

!rm -r my_dir

Secara tradisional, Anda menggunakan shutil:

import shutil
shutil.rmtree(my_dir) 
Miladiouss
sumber
3
Subproses adalah praktik yang harus dihindari
dlewin
3
Saya tidak akan merekomendasikan subprocessini. shutil.rmtreemelakukan rm -rpekerjaan dengan baik, dengan bonus tambahan bekerja di Windows.
Mark Amery