จะลบเนื้อหาของโฟลเดอร์ได้อย่างไร?


468

ฉันจะลบเนื้อหาของโฟลเดอร์ในเครื่องได้อย่างไร

โครงการปัจจุบันสำหรับ Windows แต่ฉันอยากเห็น * ระวังด้วย


2
สำหรับ * ระวังจะซื่อสัตย์ฉันก็จะใช้os.system('rm -rf folder')
Tilak Maddy

คำตอบ:


441
import os, shutil
folder = '/path/to/folder'
for filename in os.listdir(folder):
    file_path = os.path.join(folder, filename)
    try:
        if os.path.isfile(file_path) or os.path.islink(file_path):
            os.unlink(file_path)
        elif os.path.isdir(file_path):
            shutil.rmtree(file_path)
    except Exception as e:
        print('Failed to delete %s. Reason: %s' % (file_path, e))

4
หากคุณกำลังทำงานกับไดเรกทอรีที่มีขนาดใหญ่มากและโดยเฉพาะอย่างยิ่งไดเรกทอรีเครือข่ายบน windows และคุณสามารถควบคุมสภาพแวดล้อมที่โปรแกรมนี้ทำงานได้มันอาจจะคุ้มค่าหากใช้ฟังก์ชัน "os.scandir (โฟลเดอร์)" ของ Py3.5 แทน listdir หลังจากนั้นซินแท็กซ์ก็ค่อนข้างจะแตกต่างกันไป มีความสุขที่จะโพสต์ถ้าคนอื่นต้องการ
Michael Scott Cuthbert

ฉันได้รับคำเตือนจาก pylint except Exception as e:ว่าอ่านW0703: Catching too general exception Exceptionแล้ว มีข้อยกเว้นที่เจาะจงมากขึ้นในการจับหรือฉันควรเพิกเฉยหรือไม่
John Hany

7
@ JohnHany ฉันเชื่อว่าคุณต้องการจับ OSError
MikeB

246

คุณสามารถทำได้:

import os
import glob

files = glob.glob('/YOUR/PATH/*')
for f in files:
    os.remove(f)

แน่นอนคุณสามารถใช้ตัวกรองอื่นในพา ธ ของคุณตัวอย่างเช่น: /YOU/PATH/*.txt สำหรับการลบไฟล์ข้อความทั้งหมดในไดเรกทอรี


12
@Blueicefield *จะไม่แสดงรายการไฟล์ที่ซ่อนเราควรเพิ่มglob.glob('path/.*)
satoru

5
แม้ว่าจะลบรายชื่อของไฟล์ที่ดูเหมือนง่ายที่จะให้ผมทำ:import sh; sh.rm(files)
โรบินพระพุทธเจ้า

2
ในขณะที่import sh; sh.rm(files)ดูดีกว่าคุณพบปัญหาหากมีมากกว่า 1024 ไฟล์ในไดเรกทอรี
ยูจีน

235

คุณสามารถลบโฟลเดอร์เองรวมถึงเนื้อหาทั้งหมดโดยใช้shutil.rmtree:

import shutil
shutil.rmtree('/path/to/folder')
shutil.rmtree(path, ignore_errors=False, onerror=None)


ลบทรีไดเรกทอรีทั้งหมด เส้นทางจะต้องชี้ไปที่ไดเรกทอรี (แต่ไม่ใช่ลิงก์สัญลักษณ์ไปยังไดเรกทอรี) หากละเว้น_errorsเป็นจริงข้อผิดพลาดที่เกิดจากการลบที่ล้มเหลวจะถูกละเว้น หากเป็นเท็จหรือละเว้นข้อผิดพลาดดังกล่าวจะถูกจัดการโดยการเรียกตัวจัดการที่ระบุโดยonerrorหรือหากถูกละไว้พวกเขาจะยกข้อยกเว้น


270
สิ่งนี้จะไม่เพียง แต่ลบเนื้อหา แต่รวมถึงโฟลเดอร์ด้วยเช่นกัน ฉันไม่คิดว่าเป็นคำถามที่ถาม
Iker Jimenez

3
ฉันคิดว่ามันเป็นคำตอบที่ดี ทำไมคุณไม่ลบเนื้อหาและโฟลเดอร์จากนั้นสร้างโฟลเดอร์ใหม่
cssndrx

42
เนื่องจากไดเรกทอรีใหม่และไดเรกทอรีเก่าจะไม่เหมือนเดิม ดังนั้นหากโปรแกรมกำลังนั่งอยู่ในไดเรกทอรีรอสิ่งต่าง ๆ มันจะดึงพรมออกมาจากข้างใต้
Mike Cooper

30
เพียงสร้างไดเรกทอรีrmtreeใหม่อีกครั้ง กดos.makedirs(dir)
ไลค์

3
@IuliusCurt ไม่ฉันมีไดเรกทอรีที่ติดตั้งใน ram ฉันต้องว่างเปล่าและน่าเสียดายที่ฉันไม่สามารถลบได้แล้วสร้างใหม่อีกครั้ง:OSError: [Errno 16] Device or resource busy
Arnaud P

80

การเพิ่มคำตอบของ mhawke นี่คือสิ่งที่ฉันได้ดำเนินการ มันจะลบเนื้อหาทั้งหมดของโฟลเดอร์ แต่จะไม่ลบโฟลเดอร์เอง ทดสอบบน Linux ด้วยไฟล์โฟลเดอร์และลิงก์สัญลักษณ์ควรทำงานบน Windows เช่นกัน

import os
import shutil

for root, dirs, files in os.walk('/path/to/folder'):
    for f in files:
        os.unlink(os.path.join(root, f))
    for d in dirs:
        shutil.rmtree(os.path.join(root, d))

1
ทำไม 'เดิน' และไม่เพียง แต่แสดงเนื้อหาของโฟลเดอร์?
ดอน

2
นี่คือคำตอบที่ถูกต้องหากคุณต้องการลบไดเรกทอรีเช่นกัน walkถูกใช้เพื่อแยกไฟล์ dirs vs. ซึ่งจะต้องจัดการแตกต่างกัน คุณสามารถใช้os.listdirแต่คุณต้องตรวจสอบว่าแต่ละรายการเป็น dir หรือไฟล์ด้วยตนเอง
dkamins

7
นี่อยู่ใกล้ แต่ทั้ง os.walk และ shutil.rmtree เป็นแบบเรียกซ้ำ os.walk ไม่จำเป็นเนื่องจากคุณต้องการเพียงไฟล์และไดเรกทอรีที่ระดับบนสุดภายในไดเรกทอรีที่จะทำความสะอาด เพียงใช้คำสั่ง if บนองค์ประกอบใน os.listdir เพื่อดูว่าแต่ละไฟล์หรือไดเรกทอรี จากนั้นใช้ remove / unlink และ rmtree ตามลำดับ
Matthew Alpert

1
@MatthewAlpert Note แต่นั่นos.walkจะไม่หักเงินคืนที่นี่เพราะมันจะส่งคืนตัวกำเนิดที่มีลักษณะเฉพาะที่เรียกซ้ำในไดเรกทอรีย่อยเมื่อคุณพยายามที่จะก้าวไปข้างหน้าและเมื่อคุณทำการวนซ้ำครั้งแรกของลูปนี้แล้วจะไม่มีไดเรกทอรีย่อย เหลือให้ดู โดยพื้นฐานแล้วos.walkมีการใช้ที่นี่เพื่อเป็นทางเลือกในการแยกโฟลเดอร์ระดับบนสุดออกจากไฟล์ระดับบนสุด การเรียกใช้ซ้ำไม่ได้ถูกใช้และเราไม่จ่ายค่าประสิทธิภาพใด ๆ อย่างไรก็ตามมันผิดปกติและฉันยอมรับว่าวิธีการที่คุณแนะนำนั้นดีกว่าเพราะมันชัดเจนและอ่านง่ายขึ้น
Mark Amery

47

การใช้rmtreeและการสร้างโฟลเดอร์ใหม่อาจใช้งานได้ แต่ฉันพบข้อผิดพลาดเมื่อลบและสร้างโฟลเดอร์ใหม่ในไดรฟ์เครือข่ายทันที

โซลูชันที่เสนอโดยใช้ walk ไม่ทำงานตามที่ใช้rmtreeเพื่อลบโฟลเดอร์และจากนั้นอาจพยายามใช้os.unlinkไฟล์ที่เคยอยู่ในโฟลเดอร์เหล่านั้นมาก่อน สิ่งนี้ทำให้เกิดข้อผิดพลาด

globโซลูชันที่โพสต์จะพยายามลบโฟลเดอร์ที่ไม่ว่างทำให้เกิดข้อผิดพลาด

ฉันขอแนะนำให้คุณใช้:

folder_path = '/path/to/folder'
for file_object in os.listdir(folder_path):
    file_object_path = os.path.join(folder_path, file_object)
    if os.path.isfile(file_object_path) or os.path.islink(file_object_path):
        os.unlink(file_object_path)
    else:
        shutil.rmtree(file_object_path)

1
โซลูชันของคุณจะเพิ่มข้อผิดพลาดหากมี symlink ไปยังไดเรกทอรีอื่น
Blueicefield

@Blueicefield - คุณช่วยยกตัวอย่างได้ไหม ฉันทดสอบใน linux โดยใช้ไฟล์และโฟลเดอร์ symlinked และยังไม่สามารถทำให้เกิดข้อผิดพลาดได้
ท่องจำ

@jgoeders - หากมี symlink ไปไดเรกทอรีos.path.isfile()จะกลับมาFalse(เพราะมันดังต่อไป symlinks) และคุณจะจบลงด้วยการโทรshutil.rmtree()บน symlink OSError("Cannot call rmtree on a symbolic link")ซึ่งจะยกระดับ
Rockallite

1
@Rockallite แก้ไขโดยตรวจสอบ islink
kevinf

1
นอกจากนี้: @kevinf ถูกต้องเพื่อชี้ให้เห็นความจำเป็นในการislinkตรวจสอบที่นี่เพื่อจัดการ symlink ไปยังไดเรกทอรีอย่างถูกต้อง ฉันได้เพิ่มเช็คเข้าไปในคำตอบที่ยอมรับแล้ว
Mark Amery

20

นี้:

  • ลบลิงก์สัญลักษณ์ทั้งหมด
    • ลิงค์ที่ตายแล้ว
    • ลิงก์ไปยังไดเรกทอรี
    • ลิงก์ไปยังไฟล์
  • ลบไดเรกทอรีย่อย
  • ไม่ลบไดเรกทอรีหลัก

รหัส:

for filename in os.listdir(dirpath):
    filepath = os.path.join(dirpath, filename)
    try:
        shutil.rmtree(filepath)
    except OSError:
        os.remove(filepath)

เป็นคำตอบอื่น ๆ อีกมากมายนี่ไม่ได้พยายามปรับการอนุญาตให้ทำการลบไฟล์ / ไดเรกทอรี


15

ในฐานะผู้ดำเนินการ:

import os

# Python 2.7
map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) )

# Python 3+
list( map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) ) )

โซลูชันบัญชีที่มีประสิทธิภาพมากขึ้นสำหรับไฟล์และไดเรกทอรีก็จะเป็น (2.7):

def rm(f):
    if os.path.isdir(f): return os.rmdir(f)
    if os.path.isfile(f): return os.unlink(f)
    raise TypeError, 'must be either file or directory'

map( rm, (os.path.join( mydir,f) for f in os.listdir(mydir)) )

1
สำหรับการดำเนินการขนาดใหญ่ที่ใช้เครื่องกำเนิดไฟฟ้าอาจมีประสิทธิภาพมากกว่าเล็กน้อยmap( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
user25064

จริง ๆ แล้วพยายามที่จะใช้สิ่งนี้ตระหนักถึงวัตถุแผนที่จะต้องซ้ำแล้วซ้ำอีกดังนั้นจำเป็นต้องมีการเรียกไปยังรายการ (หรือบางสิ่งที่จะทำซ้ำ)list(map(os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir))))
user25064

อันแรกรวมอยู่ในคำตอบอันที่สองไม่สมเหตุสมผลสำหรับฉัน ทำไมคุณควรทำซ้ำฟังก์ชั่นที่แมปกับ iterable? แผนที่ทำอย่างนั้น
fmonegaglia

1
ใน Python3 คุณต้องห่อmapในlist การย้ำจริง ดูhttp://stackoverflow.com/questions/1303347/getting-a-map-to-return-a-list-in-python-3-x
paulwasit

หนึ่งนี้แน่นอนจะไม่ทำงานหาก 'mydir' มีอย่างน้อยหนึ่งโฟลเดอร์เป็นผลงานที่ยกเลิกการเชื่อมโยงสำหรับไฟล์เท่านั้น ...
kupsef

14

หมายเหตุ: ในกรณีที่บางคนลงคะแนนให้คำตอบของฉันฉันมีสิ่งที่จะอธิบายที่นี่

  1. ทุกคนชอบคำตอบสั้น ๆ ง่ายๆ อย่างไรก็ตามบางครั้งความจริงก็ไม่ง่ายนัก
  2. กลับไปที่คำตอบของฉัน ฉันรู้ว่าshutil.rmtree()สามารถใช้เพื่อลบทรีไดเรกทอรี ฉันใช้มันหลายครั้งในโครงการของตัวเอง แต่คุณต้องตระหนักว่าไดเรกทอรีตัวเองยังจะถูกลบออกโดย shutil.rmtree()ขณะนี้อาจจะเป็นที่ยอมรับสำหรับบางคนก็ไม่ได้คำตอบที่ถูกต้องสำหรับการลบเนื้อหาของโฟลเดอร์ (ไม่มีผลข้างเคียง)
  3. ฉันจะแสดงตัวอย่างของผลข้างเคียง สมมติว่าคุณมีไดเรกทอรีที่มีเจ้าของที่กำหนดเองและบิตโหมดซึ่งมีเนื้อหาจำนวนมาก จากนั้นคุณจะลบมันด้วยและสร้างมันด้วยshutil.rmtree() os.mkdir()และคุณจะได้รับไดเรกทอรีว่างโดยมีค่าเริ่มต้น (สืบทอด) เจ้าของและบิตโหมดแทน ในขณะที่คุณอาจมีสิทธิ์ลบเนื้อหาและแม้แต่ไดเรกทอรีคุณอาจไม่สามารถตั้งค่าเจ้าของดั้งเดิมและบิตโหมดในไดเรกทอรี (เช่นคุณไม่ใช่ superuser)
  4. สุดท้ายจะเป็นผู้ป่วยและอ่านรหัส มันยาวและน่าเกลียด (ในสายตา) แต่พิสูจน์แล้วว่าเชื่อถือได้และมีประสิทธิภาพ (ใช้งาน)

นี่เป็นวิธีแก้ปัญหาที่ยาวและน่าเกลียด แต่น่าเชื่อถือและมีประสิทธิภาพ

จะแก้ไขปัญหาบางอย่างที่ไม่ได้รับการแก้ไขโดยผู้ตอบคำถามอื่น ๆ :

  • มันจัดการกับลิงก์สัญลักษณ์อย่างถูกต้องรวมถึงไม่เรียกshutil.rmtree()ใช้ลิงก์สัญลักษณ์ (ซึ่งจะผ่านการos.path.isdir()ทดสอบว่าลิงก์ไปยังไดเรกทอรีหรือไม่แม้แต่ผลของการos.walk()มีไดเรกทอรีลิงก์สัญลักษณ์เช่นกัน)
  • มันจัดการไฟล์แบบอ่านอย่างเดียว

นี่คือรหัส (ฟังก์ชันที่มีประโยชน์เท่านั้นclear_dir()):

import os
import stat
import shutil


# http://stackoverflow.com/questions/1889597/deleting-directory-in-python
def _remove_readonly(fn, path_, excinfo):
    # Handle read-only files and directories
    if fn is os.rmdir:
        os.chmod(path_, stat.S_IWRITE)
        os.rmdir(path_)
    elif fn is os.remove:
        os.lchmod(path_, stat.S_IWRITE)
        os.remove(path_)


def force_remove_file_or_symlink(path_):
    try:
        os.remove(path_)
    except OSError:
        os.lchmod(path_, stat.S_IWRITE)
        os.remove(path_)


# Code from shutil.rmtree()
def is_regular_dir(path_):
    try:
        mode = os.lstat(path_).st_mode
    except os.error:
        mode = 0
    return stat.S_ISDIR(mode)


def clear_dir(path_):
    if is_regular_dir(path_):
        # Given path is a directory, clear its content
        for name in os.listdir(path_):
            fullpath = os.path.join(path_, name)
            if is_regular_dir(fullpath):
                shutil.rmtree(fullpath, onerror=_remove_readonly)
            else:
                force_remove_file_or_symlink(fullpath)
    else:
        # Given path is a file or a symlink.
        # Raise an exception here to avoid accidentally clearing the content
        # of a symbolic linked directory.
        raise OSError("Cannot call clear_dir() on a symbolic link")

ฉันไม่เข้าใจในการเปลี่ยนแปลงบริบทของโหมดไฟล์ที่เหมาะสม บน Mac ของฉันos.remove, ไม่เหมือนrmยูทิลิตี้มีความสุขที่จะลบไฟล์แบบอ่านอย่างเดียวตราบใดที่คุณเป็นเจ้าของพวกเขา ในขณะเดียวกันหากเป็นไฟล์ที่คุณไม่ได้เป็นเจ้าของที่คุณมีสิทธิ์เข้าถึงแบบอ่านอย่างเดียวคุณจะไม่สามารถลบหรือเปลี่ยนแปลงการอนุญาต ฉันไม่รู้สถานการณ์ใด ๆ ในระบบใด ๆ ที่คุณไม่สามารถลบไฟล์แบบอ่านอย่างเดียวos.removeได้ แต่ยังสามารถเปลี่ยนการอนุญาตได้ นอกจากนี้คุณใช้lchmodซึ่งไม่มีอยู่ใน Mac ของฉันหรือบน Windows ตามเอกสารของมัน รหัสนี้มีความหมายสำหรับแพลตฟอร์มใด!
Mark Amery

14

ฉันประหลาดใจที่ไม่มีใครพูดถึงความยอดเยี่ยมในpathlibการทำงานนี้

หากคุณต้องการลบไฟล์ในไดเรกทอรีมันสามารถเป็น oneliner ได้

from pathlib import Path

[f.unlink() for f in Path("/path/to/folder").glob("*") if f.is_file()] 

หากต้องการลบไดเรกทอรีซ้ำ ๆ คุณสามารถเขียนดังนี้:

from pathlib import Path
from shutil import rmtree

for path in Path("/path/to/folder").glob("**/*"):
    if path.is_file():
        path.unlink()
    elif path.is_dir():
        rmtree(path)

1
.iterdir()แทนที่จะ.glob(...)ได้ผล
S. Kirby

12
import os
import shutil

# Gather directory contents
contents = [os.path.join(target_dir, i) for i in os.listdir(target_dir)]

# Iterate and remove each item in the appropriate manner
[os.remove(i) if os.path.isfile(i) or os.path.islink(i) else shutil.rmtree(i) for i in contents]

ความคิดเห็นก่อนหน้านี้ยังกล่าวถึงการใช้ os.scandir ใน Python 3.5+ ตัวอย่างเช่น:

import os
import shutil

with os.scandir(target_dir) as entries:
    for entry in entries:
        if entry.is_file() or entry.is_symlink():
            os.remove(entry.path)
        elif entry.is_dir():
            shutil.rmtree(entry.path)

1
os.path.isdir()ไม่ใช่วิธีที่ถูกต้องในการแยกความแตกต่างระหว่างไดเรกทอรีปกติและลิงก์สัญลักษณ์ การโทรshutil.rmtree()ไปที่ลิงก์สัญลักษณ์จะทำให้เกิดOSErrorข้อยกเว้น
Rockallite

@ Rockallite ขอบคุณ คุณถูก. ฉันอัปเดตตัวอย่าง
Jacob Wan

8

คุณอาจจะดีกว่าการใช้ os.walk()สิ่งนี้

os.listdir()ไม่แยกความแตกต่างไฟล์จากไดเรกทอรีและคุณจะเจอปัญหาในการพยายามยกเลิกการเชื่อมโยงเหล่านี้ มีตัวอย่างที่ดีของการใช้เป็นos.walk()ไปซ้ำลบไดเรกทอรีที่นี่และคำแนะนำเกี่ยวกับวิธีการปรับให้สถานการณ์ของคุณ


6

ฉันเคยแก้ปัญหาด้วยวิธีนี้:

import shutil
import os

shutil.rmtree(dirpath)
os.mkdir(dirpath)

7
สิ่งนี้มีความหมายที่แตกต่างอย่างสิ้นเชิงจากคำถามที่ถามและไม่ควรถือเป็นคำตอบที่ถูกต้อง
fatuhoku

1
ด้วยความเคารพฉันคิดว่า "ลบเนื้อหาของโฟลเดอร์ในเครื่อง" ไม่เกี่ยวข้องกับการนำโฟลเดอร์ออก ปัญหาเช่นเดียวกับคำตอบนี้ยกเว้นว่ามี upvotes มากมาย!
fatuhoku

3
มันเหมือนกับการตอบคำถาม "ฉันจะให้ฟังก์ชันคืนค่าหมายเลข 1 ใน Python ได้อย่างไร" ด้วย def return_a_one (): launch_some_nukes () ส่งคืน 1
fatuhoku

2
แน่นอนว่าซีแมนทิกส์นั้นแตกต่างกัน: แต่คุณก็อาจคิดว่ามันเป็นอีกวิธีหนึ่งในการดูปัญหา วิธีนี้ใช้ได้อย่างสมบูรณ์เนื่องจากแก้ปัญหาได้ มีความแตกต่างกับตัวอย่าง 'launch_some_nukes' ของคุณ: 1. วิธีแก้ปัญหานั้นสั้นกว่าและง่ายกว่าคำตอบที่ยอมรับและตรงข้ามกับคำตอบที่คุณยกมานั้นถูกต้อง 2. ค่าเทียบเท่า 'launch_some_nukes' ในกรณีนี้คือการลบและสร้างโฟลเดอร์ใหม่ ความแตกต่างระหว่างโฟลเดอร์เก่ากับโฟลเดอร์ใหม่เป็นเพียงหมายเลขไอโหนด (อาจไม่เกี่ยวข้องกับ OP)
ProfHase85

2
มันค่อนข้างรื้อตึกระฟ้าและสร้างใหม่ให้มีขนาดเท่ากันทุก
ประการ

5

อีกวิธีหนึ่ง:

import sh
sh.rm(sh.glob('/path/to/folder/*'))

1
โปรดทราบว่าshไม่ใช่ส่วนหนึ่งของไลบรารีมาตรฐานและจำเป็นต้องติดตั้งจาก PyPI ก่อนจึงจะสามารถใช้งานได้ นอกจากนี้เนื่องจากสิ่งนี้เรียกใช้จริงrmใน subprocess มันจะไม่ทำงานบน Windows ที่rmไม่มีอยู่จริง นอกจากนี้ยังจะเพิ่มข้อยกเว้นหากโฟลเดอร์มีไดเรกทอรีย่อยใด ๆ
Mark Amery

5

ฉันรู้ว่ามันเป็นด้ายเก่า แต่ฉันได้พบสิ่งที่น่าสนใจจากเว็บไซต์อย่างเป็นทางการของหลาม เพียงเพื่อแบ่งปันแนวคิดอื่นสำหรับการลบเนื้อหาทั้งหมดในไดเรกทอรี เนื่องจากฉันมีปัญหาการอนุญาตเมื่อใช้ shutil.rmtree () และฉันไม่ต้องการลบไดเรกทอรีและสร้างมันขึ้นมาใหม่ เดิมเป็นที่อยู่http://docs.python.org/2/library/os.html#os.walk หวังว่าจะช่วยใครบางคน

def emptydir(top):
    if(top == '/' or top == "\\"): return
    else:
        for root, dirs, files in os.walk(top, topdown=False):
            for name in files:
                os.remove(os.path.join(root, name))
            for name in dirs:
                os.rmdir(os.path.join(root, name))

4

ในการลบไฟล์ทั้งหมดในไดเรกทอรีรวมถึงไดเรกทอรีย่อยโดยไม่ต้องลบโฟลเดอร์ออกให้ทำดังนี้

import os
mypath = "my_folder" #Enter your path here
for root, dirs, files in os.walk(mypath):
    for file in files:
        os.remove(os.path.join(root, file))

3

หากคุณใช้ระบบ * nix ทำไมไม่ใช้ประโยชน์จากคำสั่งระบบ?

import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)

3
เพราะตามที่ระบุไว้ในคำถาม "โครงการปัจจุบันสำหรับ Windows"
กับโมนิกา

3

วิธีที่ง่ายในการทำ:

import shutil, os


def remove_folder_contents(path):
    shutil.rmtree(path)
    os.makedirs(path)


remove_folder_contents('/path/to/folder')

3

ฉันคิดว่ารหัสนี้ใช้งานได้ มันจะไม่ลบโฟลเดอร์และคุณสามารถใช้รหัสนี้เพื่อลบไฟล์ที่มีนามสกุลเฉพาะ

import os
import glob

files = glob.glob(r'path/*')
for items in files:
    os.remove(items)

3

ฉันต้องลบไฟล์จาก 3 โฟลเดอร์แยกกันในไดเรกทอรีหลักเดียว:

directory
   folderA
      file1
   folderB
      file2
   folderC
      file3

รหัสง่ายๆนี้ทำให้ฉัน: (ฉันใช้ Unix)

import os
import glob

folders = glob.glob('./path/to/parentdir/*')
for fo in folders:
  file = glob.glob(f'{fo}/*')
  for f in file:
    os.remove(f)

หวังว่านี่จะช่วยได้


1

ฉันแก้ไขปัญหาด้วยrmtree makedirsการเพิ่มtime.sleep()ระหว่าง:

if os.path.isdir(folder_location):
    shutil.rmtree(folder_location)

time.sleep(.5)

os.makedirs(folder_location, 0o777)

0

คำตอบสำหรับสถานการณ์ที่ จำกัด และเฉพาะเจาะจง: สมมติว่าคุณต้องการลบไฟล์ในขณะที่ดูแลต้นไม้โฟลเดอร์ย่อยคุณสามารถใช้อัลกอริทึมแบบเรียกซ้ำได้:

import os

def recursively_remove_files(f):
    if os.path.isfile(f):
        os.unlink(f)
    elif os.path.isdir(f):
        for fi in os.listdir(f):
            recursively_remove_files(os.path.join(f, fi))

recursively_remove_files(my_directory)

อาจปิดหัวข้อเล็กน้อย แต่ฉันคิดว่าหลายคนคิดว่ามันมีประโยชน์


การใช้os.walkวิธีที่แสดงที่stackoverflow.com/a/54889532/1709587อาจเป็นวิธีที่ดีกว่าในการลบไฟล์ทั้งหมดในขณะที่ยังคงโครงสร้างไดเรกทอรีไว้
Mark Amery

-1

สมมติว่าtemp_dirจะถูกลบคำสั่งบรรทัดเดียวที่ใช้osจะเป็น:

_ = [os.remove(os.path.join(save_dir,i)) for i in os.listdir(temp_dir)]

หมายเหตุ: นี่เป็นเพียง 1 ซับสำหรับการลบไฟล์ 'ไม่ลบไดเรกทอรี

หวังว่านี่จะช่วยได้ ขอบคุณ


-1

ใช้วิธีการร้องเพื่อลบเนื้อหาของไดเรกทอรีไม่ใช่ตัวไดเรกทอรี:

import os
import shutil

def remove_contents(path):
    for c in os.listdir(path):
        full_path = os.path.join(path, c)
        if os.path.isfile(full_path):
            os.remove(full_path)
        else:
            shutil.rmtree(full_path)

@FabioSpaghetti Negative
Amir Rezazadeh

ขอบคุณอาเมียร์ฉันกำลังค้นหาวิธีแก้ปัญหาที่พบโฟลเดอร์บางโฟลเดอร์ในไดเรกทอรีย่อยทั้งหมดของไดเรกทอรีรากและลบเนื้อหาของโฟลเดอร์นั้นออก
FabioSpaghetti

สิ่งนี้จะเป็นการเพิ่มสิ่งใหม่ ๆ ที่ไม่ได้แสดงในคำตอบที่ได้รับการยอมรับมาก่อนที่คุณจะโพสต์สิ่งนี้
Mark Amery

-1

วิธีที่ง่ายที่สุดในการลบไฟล์ทั้งหมดในโฟลเดอร์ / ลบไฟล์ทั้งหมด

import os
files = os.listdir(yourFilePath)
for f in files:
    os.remove(yourFilePath + f)

ล้มเหลวหากมีไดเรกทอรีย่อย
Mark Amery

-3

สิ่งนี้ควรทำเคล็ดลับเพียงแค่ใช้โมดูลระบบปฏิบัติการเพื่อแสดงรายการแล้วลบออก!

import os
DIR = os.list('Folder')
for i in range(len(DIR)):
    os.remove('Folder'+chr(92)+i)

ทำงานให้ฉันปัญหาใด ๆ แจ้งให้เราทราบ!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.