ฉันจะลบเนื้อหาของโฟลเดอร์ในเครื่องได้อย่างไร
โครงการปัจจุบันสำหรับ Windows แต่ฉันอยากเห็น * ระวังด้วย
ฉันจะลบเนื้อหาของโฟลเดอร์ในเครื่องได้อย่างไร
โครงการปัจจุบันสำหรับ Windows แต่ฉันอยากเห็น * ระวังด้วย
คำตอบ:
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))
except Exception as e:
ว่าอ่านW0703: Catching too general exception Exception
แล้ว มีข้อยกเว้นที่เจาะจงมากขึ้นในการจับหรือฉันควรเพิกเฉยหรือไม่
คุณสามารถทำได้:
import os
import glob
files = glob.glob('/YOUR/PATH/*')
for f in files:
os.remove(f)
แน่นอนคุณสามารถใช้ตัวกรองอื่นในพา ธ ของคุณตัวอย่างเช่น: /YOU/PATH/*.txt สำหรับการลบไฟล์ข้อความทั้งหมดในไดเรกทอรี
*
จะไม่แสดงรายการไฟล์ที่ซ่อนเราควรเพิ่มglob.glob('path/.*)
import sh; sh.rm(files)
import sh; sh.rm(files)
ดูดีกว่าคุณพบปัญหาหากมีมากกว่า 1024 ไฟล์ในไดเรกทอรี
คุณสามารถลบโฟลเดอร์เองรวมถึงเนื้อหาทั้งหมดโดยใช้shutil.rmtree
:
import shutil
shutil.rmtree('/path/to/folder')
shutil.rmtree(path, ignore_errors=False, onerror=None)
ลบทรีไดเรกทอรีทั้งหมด เส้นทางจะต้องชี้ไปที่ไดเรกทอรี (แต่ไม่ใช่ลิงก์สัญลักษณ์ไปยังไดเรกทอรี) หากละเว้น_errorsเป็นจริงข้อผิดพลาดที่เกิดจากการลบที่ล้มเหลวจะถูกละเว้น หากเป็นเท็จหรือละเว้นข้อผิดพลาดดังกล่าวจะถูกจัดการโดยการเรียกตัวจัดการที่ระบุโดยonerrorหรือหากถูกละไว้พวกเขาจะยกข้อยกเว้น
rmtree
ใหม่อีกครั้ง กดos.makedirs(dir)
OSError: [Errno 16] Device or resource busy
การเพิ่มคำตอบของ 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))
walk
ถูกใช้เพื่อแยกไฟล์ dirs vs. ซึ่งจะต้องจัดการแตกต่างกัน คุณสามารถใช้os.listdir
แต่คุณต้องตรวจสอบว่าแต่ละรายการเป็น dir หรือไฟล์ด้วยตนเอง
os.walk
จะไม่หักเงินคืนที่นี่เพราะมันจะส่งคืนตัวกำเนิดที่มีลักษณะเฉพาะที่เรียกซ้ำในไดเรกทอรีย่อยเมื่อคุณพยายามที่จะก้าวไปข้างหน้าและเมื่อคุณทำการวนซ้ำครั้งแรกของลูปนี้แล้วจะไม่มีไดเรกทอรีย่อย เหลือให้ดู โดยพื้นฐานแล้วos.walk
มีการใช้ที่นี่เพื่อเป็นทางเลือกในการแยกโฟลเดอร์ระดับบนสุดออกจากไฟล์ระดับบนสุด การเรียกใช้ซ้ำไม่ได้ถูกใช้และเราไม่จ่ายค่าประสิทธิภาพใด ๆ อย่างไรก็ตามมันผิดปกติและฉันยอมรับว่าวิธีการที่คุณแนะนำนั้นดีกว่าเพราะมันชัดเจนและอ่านง่ายขึ้น
การใช้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)
os.path.isfile()
จะกลับมาFalse
(เพราะมันดังต่อไป symlinks) และคุณจะจบลงด้วยการโทรshutil.rmtree()
บน symlink OSError("Cannot call rmtree on a symbolic link")
ซึ่งจะยกระดับ
islink
ตรวจสอบที่นี่เพื่อจัดการ symlink ไปยังไดเรกทอรีอย่างถูกต้อง ฉันได้เพิ่มเช็คเข้าไปในคำตอบที่ยอมรับแล้ว
นี้:
รหัส:
for filename in os.listdir(dirpath):
filepath = os.path.join(dirpath, filename)
try:
shutil.rmtree(filepath)
except OSError:
os.remove(filepath)
เป็นคำตอบอื่น ๆ อีกมากมายนี่ไม่ได้พยายามปรับการอนุญาตให้ทำการลบไฟล์ / ไดเรกทอรี
ในฐานะผู้ดำเนินการ:
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)) )
map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
list(map(os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir))))
map
ในlist
การย้ำจริง ดูhttp://stackoverflow.com/questions/1303347/getting-a-map-to-return-a-list-in-python-3-x
หมายเหตุ: ในกรณีที่บางคนลงคะแนนให้คำตอบของฉันฉันมีสิ่งที่จะอธิบายที่นี่
shutil.rmtree()
สามารถใช้เพื่อลบทรีไดเรกทอรี ฉันใช้มันหลายครั้งในโครงการของตัวเอง แต่คุณต้องตระหนักว่าไดเรกทอรีตัวเองยังจะถูกลบออกโดย shutil.rmtree()
ขณะนี้อาจจะเป็นที่ยอมรับสำหรับบางคนก็ไม่ได้คำตอบที่ถูกต้องสำหรับการลบเนื้อหาของโฟลเดอร์ (ไม่มีผลข้างเคียง)shutil.rmtree()
os.mkdir()
และคุณจะได้รับไดเรกทอรีว่างโดยมีค่าเริ่มต้น (สืบทอด) เจ้าของและบิตโหมดแทน ในขณะที่คุณอาจมีสิทธิ์ลบเนื้อหาและแม้แต่ไดเรกทอรีคุณอาจไม่สามารถตั้งค่าเจ้าของดั้งเดิมและบิตโหมดในไดเรกทอรี (เช่นคุณไม่ใช่ superuser)นี่เป็นวิธีแก้ปัญหาที่ยาวและน่าเกลียด แต่น่าเชื่อถือและมีประสิทธิภาพ
จะแก้ไขปัญหาบางอย่างที่ไม่ได้รับการแก้ไขโดยผู้ตอบคำถามอื่น ๆ :
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")
os.remove
, ไม่เหมือนrm
ยูทิลิตี้มีความสุขที่จะลบไฟล์แบบอ่านอย่างเดียวตราบใดที่คุณเป็นเจ้าของพวกเขา ในขณะเดียวกันหากเป็นไฟล์ที่คุณไม่ได้เป็นเจ้าของที่คุณมีสิทธิ์เข้าถึงแบบอ่านอย่างเดียวคุณจะไม่สามารถลบหรือเปลี่ยนแปลงการอนุญาต ฉันไม่รู้สถานการณ์ใด ๆ ในระบบใด ๆ ที่คุณไม่สามารถลบไฟล์แบบอ่านอย่างเดียวos.remove
ได้ แต่ยังสามารถเปลี่ยนการอนุญาตได้ นอกจากนี้คุณใช้lchmod
ซึ่งไม่มีอยู่ใน Mac ของฉันหรือบน Windows ตามเอกสารของมัน รหัสนี้มีความหมายสำหรับแพลตฟอร์มใด!
ฉันประหลาดใจที่ไม่มีใครพูดถึงความยอดเยี่ยมใน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)
.iterdir()
แทนที่จะ.glob(...)
ได้ผล
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)
os.path.isdir()
ไม่ใช่วิธีที่ถูกต้องในการแยกความแตกต่างระหว่างไดเรกทอรีปกติและลิงก์สัญลักษณ์ การโทรshutil.rmtree()
ไปที่ลิงก์สัญลักษณ์จะทำให้เกิดOSError
ข้อยกเว้น
คุณอาจจะดีกว่าการใช้ os.walk()
สิ่งนี้
os.listdir()
ไม่แยกความแตกต่างไฟล์จากไดเรกทอรีและคุณจะเจอปัญหาในการพยายามยกเลิกการเชื่อมโยงเหล่านี้ มีตัวอย่างที่ดีของการใช้เป็นos.walk()
ไปซ้ำลบไดเรกทอรีที่นี่และคำแนะนำเกี่ยวกับวิธีการปรับให้สถานการณ์ของคุณ
ฉันเคยแก้ปัญหาด้วยวิธีนี้:
import shutil
import os
shutil.rmtree(dirpath)
os.mkdir(dirpath)
อีกวิธีหนึ่ง:
import sh
sh.rm(sh.glob('/path/to/folder/*'))
sh
ไม่ใช่ส่วนหนึ่งของไลบรารีมาตรฐานและจำเป็นต้องติดตั้งจาก PyPI ก่อนจึงจะสามารถใช้งานได้ นอกจากนี้เนื่องจากสิ่งนี้เรียกใช้จริงrm
ใน subprocess มันจะไม่ทำงานบน Windows ที่rm
ไม่มีอยู่จริง นอกจากนี้ยังจะเพิ่มข้อยกเว้นหากโฟลเดอร์มีไดเรกทอรีย่อยใด ๆ
ฉันรู้ว่ามันเป็นด้ายเก่า แต่ฉันได้พบสิ่งที่น่าสนใจจากเว็บไซต์อย่างเป็นทางการของหลาม เพียงเพื่อแบ่งปันแนวคิดอื่นสำหรับการลบเนื้อหาทั้งหมดในไดเรกทอรี เนื่องจากฉันมีปัญหาการอนุญาตเมื่อใช้ 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))
ในการลบไฟล์ทั้งหมดในไดเรกทอรีรวมถึงไดเรกทอรีย่อยโดยไม่ต้องลบโฟลเดอร์ออกให้ทำดังนี้
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))
หากคุณใช้ระบบ * nix ทำไมไม่ใช้ประโยชน์จากคำสั่งระบบ?
import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)
วิธีที่ง่ายในการทำ:
import shutil, os
def remove_folder_contents(path):
shutil.rmtree(path)
os.makedirs(path)
remove_folder_contents('/path/to/folder')
ฉันคิดว่ารหัสนี้ใช้งานได้ มันจะไม่ลบโฟลเดอร์และคุณสามารถใช้รหัสนี้เพื่อลบไฟล์ที่มีนามสกุลเฉพาะ
import os
import glob
files = glob.glob(r'path/*')
for items in files:
os.remove(items)
ฉันต้องลบไฟล์จาก 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)
หวังว่านี่จะช่วยได้
ฉันแก้ไขปัญหาด้วยrmtree
makedirs
การเพิ่มtime.sleep()
ระหว่าง:
if os.path.isdir(folder_location):
shutil.rmtree(folder_location)
time.sleep(.5)
os.makedirs(folder_location, 0o777)
คำตอบสำหรับสถานการณ์ที่ จำกัด และเฉพาะเจาะจง: สมมติว่าคุณต้องการลบไฟล์ในขณะที่ดูแลต้นไม้โฟลเดอร์ย่อยคุณสามารถใช้อัลกอริทึมแบบเรียกซ้ำได้:
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อาจเป็นวิธีที่ดีกว่าในการลบไฟล์ทั้งหมดในขณะที่ยังคงโครงสร้างไดเรกทอรีไว้
สมมติว่าtemp_dir
จะถูกลบคำสั่งบรรทัดเดียวที่ใช้os
จะเป็น:
_ = [os.remove(os.path.join(save_dir,i)) for i in os.listdir(temp_dir)]
หมายเหตุ: นี่เป็นเพียง 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)
วิธีที่ง่ายที่สุดในการลบไฟล์ทั้งหมดในโฟลเดอร์ / ลบไฟล์ทั้งหมด
import os
files = os.listdir(yourFilePath)
for f in files:
os.remove(yourFilePath + f)
สิ่งนี้ควรทำเคล็ดลับเพียงแค่ใช้โมดูลระบบปฏิบัติการเพื่อแสดงรายการแล้วลบออก!
import os
DIR = os.list('Folder')
for i in range(len(DIR)):
os.remove('Folder'+chr(92)+i)
ทำงานให้ฉันปัญหาใด ๆ แจ้งให้เราทราบ!
os.system('rm -rf folder')