Python'da bir dosya veya klasör nasıl silinir?
Python'da bir dosya veya klasör nasıl silinir?
Yanıtlar:
os.remove()
bir dosyayı kaldırır.
os.rmdir()
boş bir dizini kaldırır.
shutil.rmtree()
bir dizini ve tüm içeriğini siler.
Path
3.4+ pathlib
modülündeki nesneler de bu örnek yöntemlerini ortaya koyar :
pathlib.Path.unlink()
bir dosyayı veya sembolik bağı kaldırır.
pathlib.Path.rmdir()
boş bir dizini kaldırır.
os.remove()
bir istisna atar, bu nedenle os.path.isfile()
önce kontrol etmek veya a'yı sarmak gerekebilir try
.
os.remove()
bir dosya yoksa atılan istisna FileNotFoundError
.
os.remove()
Birden fazla dosyayı silmek için birden fazla bağımsız değişken mi alıyor yoksa her dosya için her seferinde çağırıyor musunuz?
import os
os.remove("/tmp/<file_name>.txt")
Veya
import os
os.unlink("/tmp/<file_name>.txt")
Veya
pathlib Python sürümü için kütüphane> 3.5
file_to_rem = pathlib.Path("/tmp/<file_name>.txt")
file_to_rem.unlink()
Dosyayı veya symbolik bağlantısını kaldırmak için kullanılan bağlantıyı kaldırma yöntemi.
Missing_ok false (varsayılan) ise, yol yoksa FileNotFoundError öğesi yükseltilir.
Missing_ok doğruysa, FileNotFoundError istisnaları yok sayılır (POSIX rm -f komutuyla aynı davranış).
Sürüm 3.8'de değiştirildi: missing_ok parametresi eklendi.
os.path.isfile("/path/to/file")
exception handling.
Örnek içinos.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))
Silinecek dosya adını girin: demo.txt Hata: demo.txt - Böyle bir dosya veya dizin yok. Silinecek dosya adını girin: rrr.txt Hata: rrr.txt - İşleme izin verilmiyor. Silinecek dosya adını girin: foo.txt
shutil.rmtree()
İçin örnek 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))
kullanım
shutil.rmtree(path[, ignore_errors[, onerror]])
( Kapatma ile ilgili tüm belgelere bakın ) ve / veya
os.remove
ve
os.rmdir
(İlgili tüm dokümanları os .)
İşte hem kullanan bir sağlam fonksiyondur os.remove
ve 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);
çağrısını simüle etmek için 8 kod satırı .
os.path.islink(file_path):
bir böcek, olmalıos.path.islink(path):
Sen yerleşik kullanabilirsiniz pathlib
modülü (Python 3.4+ gerektirir, ancak PyPI üzerinde eski sürümleri için backports vardır: pathlib
, pathlib2
).
Bir dosyayı kaldırmak için unlink
yöntem vardır:
import pathlib
path = pathlib.Path(name_of_file)
path.unlink()
Veya boş bir klasörü rmdir
kaldırma yöntemi :
import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()
pathlib
boş olmayan dizinleri silebilecek hiçbir şey (yerel olarak) görünmüyor . Ancak kullanabilirsiniz shutil.rmtree
. Diğer cevapların birkaçında bahsedildi, bu yüzden dahil etmedim.
Python'daki bir dosyayı veya klasörü nasıl silebilirim?
Python 3 için, dosyayı ve dizini ayrı ayrı kaldırmak için sırasıyla unlink
ve nesne yöntemlerini kullanın :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
Nesnelerle ilgili yolları da kullanabileceğinizi ve geçerli çalışma dizininizi ile kontrol edebileceğinizi unutmayın Path.cwd
.
Python 2'deki dosyaları ve dizinleri tek tek kaldırmak için aşağıda etiketlenen bölüme bakın.
İçeriği olan bir dizini kaldırmak için şunu kullanın shutil.rmtree
ve bunun Python 2 ve 3'te bulunduğunu unutmayın:
from shutil import rmtree
rmtree(dir_path)
Python 3.4'teki yenilik bu Path
.
Kullanımı göstermek için bir dizin ve dosya oluşturmak için birini kullanalım. /
Yolun bölümlerine katılmak için kullandığımızı unutmayın , bu, işletim sistemleri ile Windows'ta ters eğik çizgi kullanmayla ilgili sorunlar (örneğin, ters eğik çizgilerinizi iki katına çıkarmanız \\
veya ham dizeleri kullanmanız gerekir) arasındaki sorunları çözer 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()
ve şimdi:
>>> file_path.is_file()
True
Şimdi onları silelim. Önce dosya:
>>> file_path.unlink() # remove file
>>> file_path.is_file()
False
>>> file_path.exists()
False
Birden fazla dosyayı kaldırmak için globbing'i kullanabiliriz - önce bunun için birkaç dosya oluşturalım:
>>> (directory_path / 'foo.my').touch()
>>> (directory_path / 'bar.my').touch()
Sonra sadece glob paterni üzerinde tekrarlayın:
>>> 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
Şimdi, dizini kaldırmayı gösteren:
>>> directory_path.rmdir() # remove directory
>>> directory_path.is_dir()
False
>>> directory_path.exists()
False
Bir dizini ve içindeki her şeyi kaldırmak istiyorsak ne olur? Bu kullanım için,shutil.rmtree
Dizin ve dosyamızı yeniden oluşturalım:
file_path.parent.mkdir()
file_path.touch()
ve rmdir
boş olmadıkça başarısız olduğunu unutmayın , bu yüzden rmtree çok uygundur:
>>> 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'
Şimdi, rmtree'yi içe aktarın ve dizini işleve geçirin:
from shutil import rmtree
rmtree(directory_path) # remove everything
ve her şeyin kaldırıldığını görebiliriz:
>>> directory_path.exists()
False
Python 2 üzerindeyseniz , pathlib2 adlı, pathlib2 adlı ve pip ile kurulabilen bir backport var :
$ pip install pathlib2
Ve sonra kütüphaneyi pathlib
import pathlib2 as pathlib
Veya Path
nesneyi doğrudan içe aktarın (burada gösterildiği gibi):
from pathlib2 import Path
Bu çok fazlaysa veya ile dosyaları kaldırabilirsinizos.remove
os.unlink
from os import unlink, remove
from os.path import join, expanduser
remove(join(expanduser('~'), 'directory/file'))
veya
unlink(join(expanduser('~'), 'directory/file'))
ve aşağıdaki dizinleri kaldırabilirsiniz os.rmdir
:
from os import rmdir
rmdir(join(expanduser('~'), 'directory'))
Ayrıca bir de olduğunu unutmayın os.removedirs
- yalnızca boş dizinleri özyinelemeli olarak kaldırır, ancak kullanım durumunuza uygun olabilir.
rmtree(directory_path)
python 3.6.6 çalışır ama python 3.5.2 değil - rmtree(str(directory_path)))
orada gerekir .
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 eşzamansız işlevidir, bu nedenle ne zaman tamamlandığını kontrol etmek isterseniz, while ... loop
import os
import shutil
shutil.rmtree(path)
while os.path.exists(path):
pass
print('done')
shutil.rmtree
eşzamansız olması gerekiyordu. Ancak, virüs tarayıcıları karışarak Windows'ta görünebilir.
os.unlink(path, *, dir_fd=None)
veya
os.remove(path, *, dir_fd=None)
Her iki işlev de anlamsal olarak aynıdır. Bu işlevler dosya yolunu kaldırır (siler). Yol bir dosya değilse ve dizinse, istisna oluşur.
shutil.rmtree(path, ignore_errors=False, onerror=None)
veya
os.rmdir(path, *, dir_fd=None)
Bütün dizin ağaçlarını kaldırmak shutil.rmtree()
için kullanılabilir. os.rmdir
yalnızca dizin boş ve var olduğunda çalışır.
os.removedirs(name)
Bazı içeriği olan üst öğeye kadar her boş üst dizini kendi kendine kaldırır
ex. os.removedirs ('abc / xyz / pqr') dizinleri 'abc / xyz / pqr', 'abc / xyz' ve 'abc' sırayla siler.
Daha fazla bilgi için onay resmi doc için: os.unlink
, os.remove
, os.rmdir
, shutil.rmtree
,os.removedirs
Klasördeki tüm dosyaları kaldırmak için
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)
Bir dizindeki tüm klasörleri kaldırmak için
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))
Éric Araujo'nin yorumunun vurguladığı TOCTOU sorunundan kaçınmak için doğru yöntemi çağırmak için bir istisna yakalayabilirsiniz:
def remove_file_or_dir(path: str) -> None:
""" Remove a file or directory """
try:
shutil.rmtree(path)
except NotADirectoryError:
os.remove(path)
Çünkü shutil.rmtree()
sadece dizinleri kaldıracak os.remove()
veya os.unlink()
sadece dosyaları kaldıracaktır.
shutil.rmtree()
yalnızca dizini değil, içeriğini de kaldırır.
subprocess
Güzel ve okunabilir bir kod yazmanız çayınızsa kullanmanızı öneririm :
import subprocess
subprocess.Popen("rm -r my_dir", shell=True)
Ve bir yazılım mühendisi değilseniz, belki de Jupyter kullanmayı düşünün; bash komutlarını yazmanız yeterlidir:
!rm -r my_dir
Geleneksel olarak şunları kullanırsınız shutil
:
import shutil
shutil.rmtree(my_dir)
subprocess
için tavsiye etmem . shutil.rmtree
mu rm -r
Windows üzerinde çalışan avantaj ile işidir gayet güzel.