Bir dosya veya klasör nasıl silinir?


Yanıtlar:


3343

Path3.4+ pathlibmodülündeki nesneler de bu örnek yöntemlerini ortaya koyar :


5
Windows'daki os.rmdir (), hedef dizin boş olmasa bile dizin sembolik bağlantısını da kaldırır
Lu55

8
Dosya mevcut değilse, os.remove()bir istisna atar, bu nedenle os.path.isfile()önce kontrol etmek veya a'yı sarmak gerekebilir try.
Ben Crowell

2
Path.unlink 1 / özyinelemeli 2 / FileNotfoundError yoksaymak için bir seçenek eklemek isterdim.
Jérôme

7
sadece tamamlamak için ... os.remove()bir dosya yoksa atılan istisna FileNotFoundError.
PedroA

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

292

Bir dosyayı silmek için Python sözdizimi

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

Path.unlink (missing_ok = False)

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.

En iyi pratik

  1. İlk olarak, dosyanın veya klasörün var olup olmadığını kontrol edin, sonra sadece o dosyayı silin. Bu iki şekilde gerçekleştirilebilir:
    a. os.path.isfile("/path/to/file")
    b. kullanımexception 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)

İstisna işleme

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

SAYGI ÇIKIŞI

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

Bir klasörü silmek için Python sözdizimi

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

13
Dosya iki satır arasında kaldırılabileceği veya değiştirilebileceği için kontrol sırasında istisna yönetimi önerilir (TOCTOU: en.wikipedia.org/wiki/Time_of_check_to_time_of_use ) Bkz. Python SSS docs.python.org/3/glossary.html#term-eafp
Éric Araujo

84

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


6
Lütfen pathlib arayüzünü (Python 3.4'ten bu yana yeni olan) listenize ekleyin.
Paebbels

38

İşte hem kullanan bir sağlam fonksiyondur os.removeve 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))

8
Yani ISO C remove(path);çağrısını simüle etmek için 8 kod satırı .
Kaz

2
@Kaz sinir bozucu anlaştı, ama ağaçlarla olan anlaşma kaldırıldı mı? :-)
Ciro Santilli 法轮功 病毒 审查 六四 事件 法轮功

6
os.path.islink(file_path): bir böcek, olmalıos.path.islink(path):
Neo li

32

Sen yerleşik kullanabilirsiniz pathlibmodü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 unlinkyöntem vardır:

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

Veya boş bir klasörü rmdirkaldırma yöntemi :

import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()

2
Boş olmayan bir dizine ne dersiniz?
Pranasas

@Pranasas Ne yazık ki pathlibboş 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.
MSeifert

29

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

PathNesnelerle 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.rmtreeve bunun Python 2 ve 3'te bulunduğunu unutmayın:

from shutil import rmtree

rmtree(dir_path)

gösteri

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

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 Pathnesneyi doğrudan içe aktarın (burada gösterildiği gibi):

from pathlib2 import Path

Bu çok fazlaysa veya ile dosyaları kaldırabilirsinizos.removeos.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 .
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)

1
Bu sadece klasör içindeki dosyaları ve alt klasörleri
silerek

4

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

1
shutil.rmtreeeşzamansız olması gerekiyordu. Ancak, virüs tarayıcıları karışarak Windows'ta görünebilir.
mhsmith

@mhsmith Virüs tarayıcıları ? Bu vahşi bir spekülasyon mu, yoksa aslında bu etkiye neden olabileceklerini biliyor musunuz? Eğer öyleyse, bu nasıl oluyor?
Mark Amery

2

Dosyaları silmek için:

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.

Klasörleri silmek için:

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.rmdiryalnızca dizin boş ve var olduğunda çalışır.

Klasörleri üst öğeye yinelemeli olarak silmek için:

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


1

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

0

É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.
Tiago Martins Peres 李大仁

-1

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

3
Alt süreç kaçınmak için
pratiktir

3
Bunun subprocessiçin tavsiye etmem . shutil.rmtreemu rm -rWindows üzerinde çalışan avantaj ile işidir gayet güzel.
Mark Amery
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.