Bagaimana cara menghapus file atau folder dengan Python?
Bagaimana cara menghapus file atau folder dengan Python?
Jawaban:
os.remove()
menghapus file.
os.rmdir()
menghapus direktori kosong.
shutil.rmtree()
menghapus direktori dan semua isinya.
Path
objek dari pathlib
modul Python 3.4+ juga mengekspos metode instance ini:
pathlib.Path.unlink()
menghapus file atau tautan simbolis.
pathlib.Path.rmdir()
menghapus direktori kosong.
os.remove()
pengecualian, jadi mungkin perlu untuk memeriksa os.path.isfile()
dulu, atau membungkusnya dengan try
.
os.remove()
jika file tidak ada adalah FileNotFoundError
.
os.remove()
diperlukan beberapa argumen untuk menghapus banyak file, atau Anda menyebutnya setiap kali untuk setiap 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()
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.
os.path.isfile("/path/to/file")
exception 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)
#!/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))
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
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))
Berikut adalah fungsi yang kuat yang menggunakan keduanya os.remove
dan 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))
remove(path);
panggilan ISO C.
os.path.islink(file_path):
bug, harusos.path.islink(path):
Anda dapat menggunakan built-in pathlib
modul (membutuhkan Python 3.4+, tetapi ada backports untuk versi yang lebih tua di PyPI: pathlib
, pathlib2
).
Untuk menghapus file ada unlink
metode:
import pathlib
path = pathlib.Path(name_of_file)
path.unlink()
Atau rmdir
metode untuk menghapus folder kosong :
import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()
pathlib
yang dapat menangani menghapus direktori yang tidak kosong. Namun Anda bisa menggunakannya shutil.rmtree
. Itu telah disebutkan dalam beberapa jawaban lain jadi saya belum memasukkannya.
Bagaimana cara menghapus file atau folder dengan Python?
Untuk Python 3, untuk menghapus file dan direktori secara individual, gunakan metode unlink
dan 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 Path
objek, 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)
Baru dalam Python 3.4 adalah Path
objek.
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 rmdir
gagal 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
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 Path
objek (seperti yang ditunjukkan di sini):
from pathlib2 import Path
Jika terlalu banyak, Anda dapat menghapus file dengan os.remove
atauos.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.
rmtree(directory_path)
bekerja dalam python 3.6.6 tetapi tidak dalam python 3.5.2 - Anda perlu di rmtree(str(directory_path)))
sana
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)
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')
shutil.rmtree
tidak seharusnya tidak sinkron. Namun, ini mungkin tampak berada di Windows dengan pemindai virus mengganggu.
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.
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.rmdir
hanya berfungsi ketika direktori kosong dan ada.
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
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))
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.
shutil.rmtree()
menghapus tidak hanya direktori tetapi juga isinya.
Saya sarankan menggunakan subprocess
jika 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)
subprocess
ini. shutil.rmtree
melakukan rm -r
pekerjaan dengan baik, dengan bonus tambahan bekerja di Windows.