วิธีค้นหาว่ามีไดเรกทอรีอยู่ใน Python


1137

ในosโมดูลใน Python มีวิธีที่จะค้นหาว่ามีไดเรกทอรีอยู่หรือไม่:

>>> os.direxists(os.path.join(os.getcwd()), 'new_folder')) # in pseudocode
True/False

8
คำเตือน - คำตอบที่ได้คะแนนสูงสุดอาจไวต่อสภาพการแข่งขัน คุณอาจต้องการดำเนินการos.statแทนเพื่อดูว่ามีทั้งไดเรกทอรีอยู่หรือไม่และเป็นไดเรกทอรีในเวลาเดียวกัน
d33tah

1
@ d33tah คุณอาจมีจุดดี แต่ฉันไม่เห็นวิธีใช้os.statบอกไดเรกทอรีจากไฟล์ มันจะเพิ่มขึ้นOSErrorเมื่อเส้นทางไม่ถูกต้องไม่ว่าจะเป็นไฟล์หรือไดเรกทอรี นอกจากนี้รหัสใด ๆ หลังจากการตรวจสอบก็มีความอ่อนไหวต่อสภาพการแข่งขัน
Tomáš Zato - Reinstate Monica

4
@ TomášZato: ซึ่งนำไปสู่ข้อสรุปว่ามันปลอดภัยเพียงแค่ดำเนินการและจัดการข้อผิดพลาด
d33tah

2
@ David542 ฉันได้เพิ่มกรณีการชี้แจงด้วยการทดสอบเพื่อความแม่นยำสำหรับ "isdir" "มีอยู่" ฉันคิดว่าคุณจะเรียนรู้อะไรตอนนี้ แต่มันสามารถส่องสว่างผู้คนใหม่ ๆ
GeoStoneMarten

คำตอบ:


1728

คุณกำลังมองหาos.path.isdirหรือos.path.existsถ้าคุณไม่สนใจว่ามันเป็นไฟล์หรือไดเรกทอรี

ตัวอย่าง:

import os
print(os.path.isdir("/home/el"))
print(os.path.exists("/home/el/myfile.txt"))

4
@syedrakib ในขณะที่วงเล็บสามารถใช้เพื่อระบุว่าวัตถุนั้นสามารถเรียกได้ แต่ก็ไม่มีประโยชน์ใน Python เนื่องจากแม้แต่คลาสก็สามารถเรียกใช้ได้ นอกจากนี้ฟังก์ชั่นยังเป็นค่าที่ดีเยี่ยมใน Python และคุณสามารถใช้มันได้โดยไม่ต้องใช้เครื่องหมายวงเล็บเช่นในexisting = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
phihag

10
คุณสามารถส่งผ่านฟังก์ชั่นไปยังฟังก์ชั่นอื่น ๆ เช่นmapแต่ในกรณีทั่วไปคุณเรียกใช้ฟังก์ชันที่มีอาร์กิวเมนต์และวงเล็บ นอกจากนี้ยังมีการพิมพ์ผิดในตัวอย่างของคุณ filter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib'])สันนิษฐานว่าคุณหมายถึง
hughdbrown

4
นอกจากนี้ยังมีos.path.isfile(path)ถ้าคุณเพียงแคร์ว่ามันเป็นไฟล์
นิโคลัส

2
โปรดทราบว่าในบางแพลตฟอร์มสิ่งเหล่านี้จะส่งคืนค่าเท็จหากมีไฟล์ / ไดเรกทอรีอยู่ แต่เกิดข้อผิดพลาดในการอนุญาตการอ่าน
cowlinator

74

เฉียดฉิว! os.path.isdirผลตอบแทนTrueถ้าคุณผ่านในชื่อของไดเรกทอรีที่มีอยู่ในปัจจุบัน Falseถ้ามันไม่ได้อยู่หรือมันไม่ได้เป็นไดเรกทอรีแล้วก็จะส่งกลับ


70

งูหลาม 3.4 แนะนำโมดูลเข้าไปในห้องสมุดมาตรฐานซึ่งมีแนวทางเชิงวัตถุเส้นทางการจัดการระบบแฟ้ม และวิธีการของวัตถุที่สามารถใช้ในการตอบคำถาม:pathlibis_dir()exists()Path

In [1]: from pathlib import Path

In [2]: p = Path('/usr')

In [3]: p.exists()
Out[3]: True

In [4]: p.is_dir()
Out[4]: True

เส้นทาง (และสตริง) สามารถรวมเข้าด้วยกันกับ/โอเปอเรเตอร์:

In [5]: q = p / 'bin' / 'vim'

In [6]: q
Out[6]: PosixPath('/usr/bin/vim') 

In [7]: q.exists()
Out[7]: True

In [8]: q.is_dir()
Out[8]: False

Pathlib ยังมีอยู่ใน Python 2.7 ผ่านโมดูล pathlib2 บน PyPi


คำอธิบายบางอย่างจะเป็นประโยชน์ ทำไมคุณกำลังทำอะไร " p / 'bin' / 'vim'?
นาธาน

1
@frank ฉันได้อธิบายเล็กน้อยในส่วนที่สองของคำตอบ
joelostblom

34

os.path.exists()ใช่การใช้งาน


23
ไม่ได้ตรวจสอบว่าเส้นทางเป็นไดเรกทอรี
Kirk Strauser

7
โทรดีมาก คนอื่น ๆ ได้ชี้ให้เห็นว่าos.path.isdirจะสำเร็จ
aganders3

3
หากคุณเข้าใจว่าไม่ได้ตอบคำถามทำไมคุณไม่ลบคำตอบออก?

3
@CamilStaps คำถามนี้ถูกดู 354000 ครั้ง (โดยขณะนี้) คำตอบที่นี่ไม่เพียง แต่สำหรับ OP แต่สำหรับใครก็ตามที่มาที่นี่ได้ไม่ว่าด้วยเหตุผลใด คำตอบของ aganders3 นั้นตรงประเด็นแม้ว่าจะไม่สามารถแก้ไขปัญหา OP ได้โดยตรง
Gabriel

4
@ กาเบรียลแล้วควรจะชัดเจนในคำตอบสิ่งนี้จริง

21

เราสามารถตรวจสอบกับ 2 ฟังก์ชั่นในตัว

os.path.isdir("directory")

มันจะให้บูลีนจริงไดเรกทอรีที่ระบุสามารถใช้ได้

os.path.exists("directoryorfile")

มันจะให้บูลีนจริงถ้าไดเรกทอรีหรือไฟล์ที่ระบุสามารถใช้ได้

เพื่อตรวจสอบว่าเส้นทางเป็นไดเรกทอรีหรือไม่

os.path.isdir("directorypath")

จะให้บูลีนจริงถ้าเส้นทางเป็นไดเรกทอรี


2
นี่คือคำตอบที่เก่าที่สุดและซ้ำซ้อนทั้งหมด
Davis Herring


10

ในขณะที่:

In [3]: os.path.exists('/d/temp')
Out[3]: True

อาจจะโยนในos.path.isdir(...)เพื่อให้แน่ใจว่า


10

เพียงเพื่อให้os.statรุ่น (หลาม 2):

import os, stat, errno
def CheckIsDir(directory):
  try:
    return stat.S_ISDIR(os.stat(directory).st_mode)
  except OSError, e:
    if e.errno == errno.ENOENT:
      return False
    raise

7

ระบบปฏิบัติการให้ความสามารถกับคุณมากมาย:

import os
os.path.isdir(dir_in) #True/False: check if this is a directory
os.listdir(dir_in)    #gets you a list of all files and directories under dir_in

listdir จะส่งข้อยกเว้นหากเส้นทางอินพุตไม่ถูกต้อง


5
#You can also check it get help for you

if not os.path.isdir('mydir'):
    print('new directry has been created')
    os.system('mkdir mydir')

6
หลามมีฟังก์ชันในตัวเพื่อสร้างไดเรกทอรีดังนั้นควรใช้os.makedirs('mydir')แทนดีกว่าos.system(...)
gizzmole

9
คุณกำลังพิมพ์ที่'สร้างไดเรกทอรีใหม่'แต่คุณไม่ทราบ ถ้าคุณไม่มีสิทธิ์สร้างไดเรกทอรี? คุณจะพิมพ์'สร้างไดเรกทอรีใหม่'แต่จะไม่เป็นจริง มันจะ.
Wojciech Jakubas

4

มีUnipathโมดูลที่สะดวก

>>> from unipath import Path 
>>>  
>>> Path('/var/log').exists()
True
>>> Path('/var/log').isdir()
True

สิ่งที่เกี่ยวข้องอื่น ๆ ที่คุณอาจต้องการ:

>>> Path('/var/log/system.log').parent
Path('/var/log')
>>> Path('/var/log/system.log').ancestor(2)
Path('/var')
>>> Path('/var/log/system.log').listdir()
[Path('/var/foo'), Path('/var/bar')]
>>> (Path('/var/log') + '/system.log').isfile()
True

คุณสามารถติดตั้งโดยใช้ pip:

$ pip3 install unipath

pathlibมันคล้ายกับในตัว ความแตกต่างคือมันปฏิบัติต่อทุกเส้นทางเป็นสตริง ( Pathเป็น subclass ของstr) ดังนั้นหากฟังก์ชั่นบางอย่างคาดหวังสตริงคุณสามารถผ่านมันได้อย่างง่ายดายPathวัตถุโดยไม่จำเป็นต้องแปลงเป็นสตริง

ตัวอย่างเช่นวิธีนี้ใช้งานได้ดีกับ Django และsettings.py:

# settings.py
BASE_DIR = Path(__file__).ancestor(2)
STATIC_ROOT = BASE_DIR + '/tmp/static'

4

คุณอาจต้องการสร้างไดเรกทอรีหากยังไม่มี

แหล่งหากยังคงมีอยู่ดังนั้น

================================================== ===================

บน Python ≥ 3.5 ให้ใช้pathlib.Path.mkdir:

from pathlib import Path
Path("/my/directory").mkdir(parents=True, exist_ok=True)

สำหรับ Python เวอร์ชันเก่าฉันเห็นคำตอบสองข้อที่มีคุณสมบัติที่ดีแต่ละข้อมีข้อบกพร่องเล็ก ๆ ดังนั้นฉันจะให้เวลากับฉัน:

ลองos.path.existsและพิจารณาos.makedirsการสร้าง

import os
if not os.path.exists(directory):
    os.makedirs(directory)

ตามที่ระบุไว้ในความคิดเห็นและที่อื่น ๆ ที่มีการแย่งชิง - ถ้าไดเรกทอรีถูกสร้างขึ้นระหว่างos.path.existsและos.makedirsสายที่จะล้มเหลวกับos.makedirs OSErrorน่าเสียดายที่การจับตัวผ้าห่มOSErrorและการทำต่อเนื่องนั้นไม่สามารถป้องกันได้เพราะมันจะเพิกเฉยต่อความล้มเหลวในการสร้างไดเรกทอรีเนื่องจากปัจจัยอื่น ๆ เช่นการอนุญาตที่ไม่เพียงพอเต็มดิสก์เป็นต้น

ทางเลือกหนึ่งคือการดักจับOSErrorและตรวจสอบรหัสข้อผิดพลาดในตัว (ดูที่วิธีการรับข้อมูลจาก OSError ของ Python )

import os, errno

try:
    os.makedirs(directory)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise

หรืออาจมีวินาที os.path.existsแต่สมมติว่ามีอีกสร้างไดเรกทอรีหลังจากการตรวจสอบครั้งแรกแล้วลบออกก่อนที่สอง - เราอาจยังคงถูกหลอก

ขึ้นอยู่กับแอปพลิเคชันอันตรายของการดำเนินการพร้อมกันอาจจะมากหรือน้อยกว่าอันตรายที่เกิดจากปัจจัยอื่น ๆ เช่นการอนุญาตไฟล์ ผู้พัฒนาจะต้องรู้เพิ่มเติมเกี่ยวกับแอปพลิเคชันเฉพาะที่กำลังพัฒนาและสภาพแวดล้อมที่คาดไว้ก่อนที่จะเลือกการนำไปใช้

Python เวอร์ชั่นใหม่ปรับปรุงโค้ดนี้ให้ดีขึ้นเล็กน้อยโดยการเปิดเผยFileExistsError(ใน 3.3 +) ...

try:
    os.makedirs("path/to/directory")
except FileExistsError:
    # directory already exists
    pass

... และด้วยการอนุญาตให้อาร์กิวเมนต์คำหลักos.makedirsเรียกexist_ok (ใน 3.2+)

os.makedirs("path/to/directory", exist_ok=True)  # succeeds even if directory exists.

0

สองสิ่ง

  1. ตรวจสอบว่าไดเรกทอรีอยู่?
  2. ถ้าไม่สร้างไดเรกทอรี (ไม่จำเป็น)
import os
dirpath = "<dirpath>" # Replace the "<dirpath>" with actual directory path.

if os.path.exists(dirpath):
   print("Directory exist")
else: #this is optional if you want to create a directory if doesn't exist.
   os.mkdir(dirpath):
   print("Directory created")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.