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

เผยแพร่แล้ว: 2021-06-16

ไลบรารีมาตรฐาน 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 ให้ตั้งค่าโครงสร้างไฟล์อย่างง่ายด้วยตัวจัดการไฟล์แบบกราฟิก

สุดท้าย เราจะใช้ Ipython เป็น Python shell แบบโต้ตอบซึ่งมีอินเทอร์เฟซที่สวยงามสำหรับใช้งาน นี่เป็นเพียงสินค้าโภคภัณฑ์ ดังนั้นจึงไม่จำเป็นอย่างยิ่ง

 pip install ipython

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

เชลล์แบบโต้ตอบ Ipython ที่รัน Python 3.9

ตอนนี้คุณพร้อมแล้ว มาดูวิธีการตรวจสอบว่ามีโฟลเดอร์หรือไฟล์อยู่ใน 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

การเรียก <span class="pre">file.write()</span> โดยไม่ใช้ <span class="pre">file.write()</span> <span class="pre">with</span> หรือการเรียก <span class="pre">file.close()</span> อาจ ส่งผลให้อาร์กิวเมนต์ของ <span class="pre">file.write()</span> ไม่ถูกเขียนลงดิสก์อย่างสมบูรณ์ แม้ว่าโปรแกรมจะออกจากการทำงานได้สำเร็จก็ตาม

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

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

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

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

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

ใน 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 เราใช้แบ็กสแลช (\)

ในโค้ดด้านบน ฟังก์ชัน 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

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

Glob

โมดูล glob มีฟังก์ชันการทำงานกับรูปแบบคล้ายเชลล์ Unix (ดังนั้นจึงทำงานไม่ถูกต้องบน 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']

การใช้คลาสพาธ

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

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

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

วิธีเส้นทางที่คุณจะใช้:

  • เส้นทาง().exists()
  • เส้นทาง().is_file()
  • เส้นทาง().is_dir()

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

 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: ตรวจสอบว่ามีเส้นทางอยู่หรือไม่
  • test -f: ตรวจสอบว่ามีไฟล์อยู่หรือไม่
  • test-d: ตรวจสอบว่ามีโฟลเดอร์อยู่หรือไม่

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

 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 ใช้แบ็กสแลช (\)

อ่านต่อ: Subprocess ใน Python คืออะไร? [5 ตัวอย่างการใช้งาน]