7 วิธีในการตรวจสอบว่ามีไฟล์หรือโฟลเดอร์ใน Python หรือไม่

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

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

ในบทช่วยสอนวันนี้ คุณจะได้เรียนรู้วิธีง่ายๆ ในการตรวจสอบว่ามีไฟล์หรือโฟลเดอร์อยู่ใน Python หรือไม่

ก่อนเริ่ม

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

python --version
# Python 3.9.5, my result

หากคุณมีเวอร์ชัน 2.x คุณจะต้องใช้คำสั่ง “python3” ตรวจสอบคู่มือการติดตั้ง Python ของเรา หากคุณไม่ได้ติดตั้ง Python 3

เราจะใช้ไฟล์ทดสอบพร้อมกับบทช่วยสอนนี้ ดังนั้นอย่าลืมสร้างไฟล์ต่อไปนี้:

touch testfile.txt
mkdir testdirectory/ 
touch testdirectory/otherfile.txt

คำสั่งด้านบนสร้างไฟล์สำหรับเล่น ไดเร็กทอรีการทดสอบ และไฟล์อื่นภายในไดเร็กทอรีการทดสอบ ไฟล์สามารถว่างเปล่าได้เนื่องจากเราไม่จำเป็นต้องอ่านเนื้อหา

หมายเหตุ: หากคุณใช้ Windows ให้ตั้งค่าโครงสร้างไฟล์อย่างง่ายของไฟล์นั้นด้วยตัวจัดการไฟล์แบบกราฟิก

ในที่สุดเราจะใช้ อิไพธอน เป็นเชลล์ Python แบบอินเทอร์แอคทีฟของเราซึ่งมีอินเทอร์เฟซที่สวยงามให้ใช้งาน นี่เป็นเพียงสินค้าจึงไม่จำเป็นอย่างยิ่ง

pip install ipython

หลังจากทำเช่นนี้ คุณจะสามารถเข้าถึง Python shell ที่สวยงามได้เพียงแค่พิมพ์ ipython

ตอนนี้คุณพร้อมแล้ว มาดูวิธีการตรวจสอบว่ามีโฟลเดอร์หรือไฟล์อยู่ใน Python หรือไม่

ลอง เปิด และยกเว้น

นี่เป็นตัวเลือกที่ตรงไปตรงมาที่สุด หากคุณพยายามเปิดไฟล์ที่ไม่มีอยู่ Python จะเพิ่มไฟล์ FileNotFoundError.

In [1]: open('im-not-here.txt')
---------------------------------------------------------------------------
FileNotFoundError: [Errno 2] No such file or directory: 'im-not-here.txt'

เราสามารถใช้ประโยชน์จากสิ่งนี้และจัดการกับข้อยกเว้นในกรณีที่ไม่มีไฟล์ที่เรากำลังมองหาอยู่

In [2]: try:
   ...:     file = open('im-not-here.txt')
   ...:     print(file) # File handler
   ...:     file.close()
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we're looking for doesn' exist')
   ...:     exit()
   ...: 
Sorry the file we're looking for doesn't exist

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

โปรดทราบว่าฟังก์ชัน exit() จะทำงานก็ต่อเมื่อมีข้อยกเว้นเกิดขึ้นเท่านั้น มาดูกันว่าจะเกิดอะไรขึ้นเมื่อไฟล์ที่เรากำลังมองหามีอยู่จริง

In [2]: try:
   ...:     file = open('testfile.txt')
   ...:     print(file) # File handler
   ...:     file.close()
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we're looking for doesn't exist')
   ...:     exit()
   ...: 
<_io.TextIOWrapper name="testfile.txt" mode="r" encoding='UTF-8'>

สังเกตวิธีที่เราปิดไฟล์ทันทีหลังจากที่เปิด ถือเป็นแนวปฏิบัติที่ดีตาม เอกสาร Python.

  วิธีอัปเกรดเฟิร์มแวร์ของเราเตอร์ของคุณ พร้อมเหตุผลว่าทำไมจึงต้องเสร็จสิ้น

การเรียก file.write() โดยไม่ต้องใช้คีย์เวิร์ด ด้วย หรือเรียก file.close() อาจส่งผลให้อาร์กิวเมนต์ของ file.write() เขียนลงดิสก์ได้ไม่สมบูรณ์ แม้ว่าโปรแกรมจะออกได้สำเร็จก็ตาม

แม้ว่าเราจะไม่ได้เขียนไฟล์ ขอแนะนำอย่างยิ่งให้ปิดไฟล์เพราะอาจนำไปสู่ ปัญหาด้านประสิทธิภาพหลายอย่าง.

หากเราไม่ต้องการปิดไฟล์ด้วยตัวเอง เราสามารถใช้ the กับตัวจัดการบริบท มันจัดสรรและปล่อยทรัพยากรอย่างแม่นยำ ดังนั้นเราจึงไม่จำเป็นต้องปิดไฟล์

In [3]: try:
   ...:     with open('testfile.txt') as file:
   ...:         print(file)
   ...:         # No need to close the file
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we're looking for doesn't exist')
   ...:     exit()
   ...: 
   ...: 
<_io.TextIOWrapper name="testfile.txt" mode="r" encoding='UTF-8'>

วิธีนี้มีประโยชน์อย่างยิ่งเมื่อเขียนไฟล์ แต่ผลลัพธ์จะไม่ได้ผลหากเราต้องการตรวจสอบว่ามีไฟล์อยู่หรือไม่ มาดูตัวเลือกอื่นๆ เพื่อบรรลุเป้าหมายนี้กัน

os.path.exists()

เดอะ โมดูลระบบปฏิบัติการ มีฟังก์ชั่นหลายอย่างในการโต้ตอบกับระบบปฏิบัติการ ในการตรวจสอบว่ามีไฟล์หรือโฟลเดอร์อยู่หรือไม่ เราสามารถใช้ฟังก์ชัน path.exists() ซึ่งยอมรับเส้นทางไปยังไฟล์หรือไดเร็กทอรีเป็นอาร์กิวเมนต์ มันจะคืนค่าบูลีนตามการมีอยู่ของเส้นทาง

หมายเหตุ: เส้นทางคือตำแหน่งเฉพาะของไฟล์หรือไดเร็กทอรีในระบบไฟล์

ใน Python, os.path โมดูลย่อยมีฟังก์ชันที่ออกแบบมาเพื่อทำงานกับเส้นทางของไฟล์โดยเฉพาะ ฟังก์ชันทั้งหมดเหล่านี้ยอมรับอาร์กิวเมนต์พาธเป็นสตริงหรือไบต์ และคุณสามารถตัดสินใจว่าจะใช้พาธแบบสัมบูรณ์ เช่น:

/home/daniel/.bashrc

หรือด้วยพาธสัมพัทธ์ ขึ้นอยู่กับไดเร็กทอรีที่คุณเรียกใช้สคริปต์:

.bashrc
# Running the script in my home folder

ต่อไปนี้คือตัวอย่างต่างๆ ที่ใช้ฟังก์ชัน os.path.exists() ซึ่งทำงานในไดเร็กทอรีซึ่งมีไฟล์การทดสอบของฉันอยู่:

In [1]: import os

In [2]: os.path.exists('testfile.txt')
Out[2]: True

In [3]: os.path.exists('testdirectory')
Out[3]: True

In [4]: os.path.exists('hey-i-dont-exist')
Out[4]: False

อย่างที่คุณเห็น จะส่งกลับ True เมื่อทำการทดสอบกับไฟล์ testfile.txt และโฟลเดอร์ testdirectory และคืนค่า False เมื่อไม่มีไฟล์อยู่

os.path.isfile()

หากคุณต้องการพิสูจน์การมีอยู่ของไฟล์ (ไม่ใช่ไดเร็กทอรี) คุณต้องเรียกใช้ฟังก์ชัน os.path.isfile()

In [1]: import os

In [2]: os.path.isfile('testfile.txt')
Out[2]: True

In [3]: os.path.isfile('testdirectory/')
Out[3]: False

In [4]: os.path.isfile('i-dont-even-exist')
Out[4]: False

In [5]: os.path.isfile('testdirectory/otherfile.txt')
Out[5]: True

หมายเหตุ: ใน UNIX ทุกไดเร็กทอรีจะลงท้ายด้วยเครื่องหมายทับ (/) ในขณะที่ Windows ใช้เครื่องหมายทับขวา ()

  15 หลักสูตรออนไลน์ที่ดีในการเรียนรู้ DevOps

ในโค้ดด้านบน ฟังก์ชัน isfile() คืนค่า False สองครั้ง มาดูกันว่าทำไม:

  • testdirectory/ เป็นไดเร็กทอรี ดังนั้นจึงไม่ถือว่าเป็นไฟล์ สิ่งนี้ไม่เป็นความจริงอย่างแน่นอนตั้งแต่ใน Linux ทุกอย่างเป็นตัวอธิบายไฟล์แต่ Python ปฏิบัติต่อไดเร็กทอรีต่างกันเพื่อความสะดวก (หากคุณพยายามเปิดไดเร็กทอรี คุณจะได้รับ IsADirectoryError)
  • i-dont-even-exist ชี้ไปที่ไฟล์ที่ไม่มีอยู่จริง

os.path.isdir()

หากคุณต้องการตรวจสอบว่าไดเร็กทอรีอยู่ในตำแหน่งที่ถูกต้อง คุณจะต้องใช้ฟังก์ชัน os.path.isdir() ซึ่งจะคืนค่า True หากพาธที่ระบุชี้ไปยังไดเร็กทอรีเท่านั้น

In [1]: import os

In [2]: os.path.isdir('testfile.txt')
Out[2]: False

In [3]: os.path.isdir('testdirectory')
Out[3]: True

In [4]: os.path.isdir('anotherfile.txt')
Out[4]: False

โปรดทราบว่าตัวอย่างข้างต้นส่งคืน False อย่างไร แม้ว่าเส้นทางจะชี้ไปยังไฟล์ที่มีอยู่

ลูกโลก

เดอะ ลูกโลก โมดูลจัดเตรียมฟังก์ชันการทำงานด้วย รูปแบบคล้ายเปลือกยูนิกซ์ (ดังนั้นจึงทำงานไม่ถูกต้องบน Windows) หากต้องการตรวจสอบว่าไฟล์ตรงกับรูปแบบภายในไดเร็กทอรีปัจจุบันหรือไม่ คุณสามารถใช้ glob.glob() การทำงาน.

In [1]: import glob

In [2]: glob.glob('testfile.txt')
Out[2]: ['testfile.txt']

In [3]: glob.glob('testdirectory')
Out[3]: ['testdirectory']

ในโค้ดด้านบน รูปแบบที่ส่งผ่านไปยังฟังก์ชัน glob เป็นสตริงปกติที่แสดงพาธไปยังไฟล์ทดสอบและไดเร็กทอรี เนื่องจากมีทั้งสองพาธ ฟังก์ชันจึงส่งคืนรายการที่มีชื่อพาธตรงกันอยู่ภายใน

หมายเหตุ: หากรูปแบบไม่ตรงกัน คุณจะได้รับรายการว่าง

เมื่อพิจารณาว่าเราสามารถส่งรูปแบบไปยังฟังก์ชัน glob ได้ ทำไมไม่ลองทดสอบข้อดีหลักๆ ของมันดูล่ะ

รหัสด้านล่างรับเส้นทางไฟล์ทั้งหมดที่มีนามสกุล .txt และ .py ตามลำดับ:

In [4]: glob.glob('*.txt')
Out[4]: ['testfile.txt']

In [5]: glob.glob('*.py')
Out[5]: 
['pathlib-exists.py',
 'list-dir.py',
 'glob-file.py',
 'open-except.py',
 'subprocess-test.py',
 'isfile.py',
 'exists.py',
 'isdir.py']

การใช้คลาสเส้นทาง

เดอะ คลาสเส้นทาง เป็นหนึ่งในวิธีที่ดีที่สุดในการทำงานกับพาธ เนื่องจากมันทำให้เรามีส่วนต่อประสานที่สะอาดเพื่อทำงานกับพาธของไฟล์ในรูปแบบอ็อบเจกต์

สิ่งที่สำคัญที่สุดของเค้กคืออินสแตนซ์ของเส้นทางมีวิธีการทั้งหมดที่คุณต้องการเพื่อรับข้อมูลเกี่ยวกับเส้นทางหนึ่งๆ ซึ่งรวมถึงฟังก์ชันการทำงานที่คล้ายกันกับตัวเลือกก่อนหน้า

หมายเหตุ: คุณต้องใช้ Python 3.4 ขึ้นไปเพื่อใช้ไลบรารี pathlib

วิธีการ Path ที่คุณจะใช้:

ตรวจสอบว่ามีเส้นทางอยู่หรือไม่

In [1]: from pathlib import Path

In [2]: Path('testfile.txt').exists()
Out[2]: True

In [3]: Path('im-not-here.txt').exists()
Out[3]: False

In [4]: Path('testdirectory').exists()
Out[4]: True

ทำงานเหมือนกับ os.path.exists()

ตรวจสอบว่าเส้นทางชี้ไปที่ไฟล์หรือไม่

In [5]: Path('testfile.txt').is_file()
Out[5]: True

In [6]: Path('testdirectory').is_file()
Out[6]: False

เทียบเท่ากับ os.path.isfile()

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

In [7]: Path('testfile.txt').is_dir()
Out[7]: False

In [8]: Path('testdirectory').is_dir()
Out[8]: True

สอดคล้องกับ os.path.isdir()

กระบวนการย่อย

หากคุณเป็นผู้ชื่นชอบโมดูลกระบวนการย่อย คุณจะต้องทราบเกี่ยวกับตัวเลือกนี้ คุณสามารถระบุได้ว่ามีไฟล์หรือโฟลเดอร์อยู่หรือไม่โดยใช้ คำสั่งทดสอบ.

หมายเหตุ: คำสั่งทดสอบใช้งานได้ใน Unix เท่านั้น

แฟล็กการทดสอบต่อไปนี้จะทำให้งานสำเร็จลุล่วง:

  • ทดสอบ -e: ตรวจสอบว่ามีเส้นทางอยู่หรือไม่
  • ทดสอบ -f: ตรวจสอบว่ามีไฟล์อยู่หรือไม่
  • ทดสอบ-d: ตรวจสอบว่ามีโฟลเดอร์อยู่หรือไม่
  คู่มือแนะนำ AWS DocumentDB

ในกรณีที่คุณต้องการดำดิ่งสู่การทดสอบแฟล็กเพิ่มเติม คุณสามารถอ่านคู่มือได้โดยการเรียกใช้:

man test

ตรวจสอบเส้นทางด้วยกระบวนการย่อย:

รหัสด้านล่างกำหนดว่าเส้นทางมีอยู่โดยการเปรียบเทียบรหัสส่งคืนของกระบวนการย่อยเป็น 0

โปรดจำไว้ว่าใน Linux หากกระบวนการดำเนินไปได้ด้วยดี ระบบจะส่งคืนค่าศูนย์ หากไม่เป็นเช่นนั้น ระบบจะส่งคืนโค้ดอื่นๆ

In [1]: from subprocess import run

In [2]: run(['test', '-e', 'testfile.txt']).returncode == 0
Out[2]: True

In [3]: run(['test', '-e', 'im-not-here.txt']).returncode == 0
Out[3]: False

ในคำสั่งแรก เรากำลังนำเข้าโมดูลกระบวนการย่อย จากนั้นใช้ เรียกใช้ฟังก์ชัน และรับรหัสส่งคืน

ตรวจสอบการมีอยู่ของไฟล์ด้วยกระบวนการย่อย

In [4]: run(['test', '-f', 'testfile.txt']).returncode == 0
Out[4]: True

In [5]: run(['test', '-f', 'testdirectory']).returncode == 0
Out[5]: False

ตรวจสอบไดเร็กทอรีด้วยกระบวนการย่อย:

In [6]: run(['test', '-d', 'testfile.txt']).returncode == 0
Out[6]: False

In [7]: run(['test', '-d', 'testdirectory']).returncode == 0
Out[7]: True

ไม่แนะนำให้ใช้ตัวเลือกนี้เนื่องจากใช้ทรัพยากรมากกว่า และเราไม่ได้ประโยชน์ใดๆ จากตัวเลือกนี้

เพื่อสรุป

Python เป็นหนึ่งในภาษาโปรแกรมที่ใช้มากที่สุดเพื่อทำให้กระบวนการเป็นไปโดยอัตโนมัติโดยการโต้ตอบกับระบบปฏิบัติการ สิ่งหนึ่งที่ยอดเยี่ยมที่คุณสามารถทำได้คือการตรวจสอบว่ามีไฟล์หรือโฟลเดอร์อยู่หรือไม่

วิธีที่ตรงไปตรงมาที่สุดคือ:

  • การเปิดและจัดการข้อยกเว้นของไฟล์ทันที
  • การใช้ฟังก์ชันที่มีอยู่ () ของโมดูล os.path หรือ pathlib

ในบทช่วยสอนนี้ คุณได้เรียนรู้:

  • วิธีเปิดไฟล์และจัดการข้อยกเว้นในกรณีที่ไม่มีอยู่
  • ความหมายของเส้นทาง
  • 3 ฟังก์ชันที่แตกต่างกันที่โมดูลย่อย os.path มีให้เพื่อตรวจสอบการมีอยู่ของไฟล์หรือโฟลเดอร์
  • Unix ใช้เครื่องหมายทับ (/) ในขณะที่ Windows ใช้เครื่องหมายทับกลับ ()

อ่านต่อ: กระบวนการย่อยใน Python คืออะไร [5 Usage Examples]

เรื่องล่าสุด

x