วิธีการตรวจสอบว่าเส้นทางเป็นเส้นทางที่แน่นอนหรือเส้นทางสัมพัทธ์ในทางข้ามแพลตฟอร์มด้วย Python?


142

พา ธ สัมบูรณ์ UNIX เริ่มต้นด้วย '/' ในขณะที่ Windows เริ่มต้นด้วยตัวอักษร 'C:' หรือ '\' ไพ ธ อนมีฟังก์ชั่นมาตรฐานเพื่อตรวจสอบว่าพา ธ นั้นเป็นแบบสัมบูรณ์หรือสัมพัทธ์หรือไม่?

คำตอบ:


208

os.path.isabsผลตอบแทนTrueถ้าเส้นทางที่แน่นอนFalseถ้าไม่ เอกสารบอกว่าใช้งานได้ใน windows (ฉันสามารถยืนยันได้ว่าทำงานได้ใน Linux เป็นการส่วนตัว)

os.path.isabs(my_path)

1
ฟังก์ชั่นนี้ไม่ได้ข้ามแพลตฟอร์ม On Unix os.path.isabs('c:\\')คืนค่า False
Anatoly techtonik

69
Rotfl และมันควรกลับเท็จเนื่องจาก C: \\ ไม่ใช่เส้นทางที่แน่นอนในระบบ Unix เส้นทางที่แน่นอนในแพลตฟอร์ม Unix เริ่มต้นด้วย "/" เช่น "/ var / custApp /" ฯลฯ :)
มาเร็ค Lewandowski

29
@techtonik เพื่อให้ชัดเจนกับคนอื่น ๆ ที่อาจพบสิ่งนี้: `c: \ 'เป็นชื่อไฟล์ / ไดเรกทอรีที่ถูกต้องสมบูรณ์ในยูนิกซ์ ดังนั้นมันจะเป็นเส้นทางสัมพัทธ์ในระบบยูนิกซ์ ดังนั้นฟังก์ชั่นข้ามแพลตฟอร์ม เพราะมันคำนึงถึงความเชี่ยวชาญของ Windows และ Unix
เล็มมิ่ง

1
เผง มันไม่ได้ทำงานเหมือนกันในแพลตฟอร์มที่แตกต่างกันมันให้คำตอบที่ถูกต้องสำหรับแพลตฟอร์มปัจจุบัน
Kevin Cox

ไม่ตอบคำถาม หากต้องการมีกฎข้ามแพลตฟอร์มให้ใช้ 'ntpath' หรือ 'posixpath' แทน 'os.path'
Shoham

43

และถ้าสิ่งที่คุณต้องการจริงๆคือเส้นทางที่สมบูรณ์ไม่ต้องกังวลกับการตรวจสอบเพื่อดูว่ามันเป็นเพียงแค่รับabspath:

import os

print os.path.abspath('.')

7
มันอาจไม่ได้ตอบคำถามเดิม แต่สิ่งที่ฉันกำลังมองหาโดยไม่รู้ตัว ขอบคุณ!
mephisto


7
import os.path

os.path.isabs('/home/user')
True

os.path.isabs('user')
False

3
ฉันไม่คิดว่าแบ็กสแลชจะใช้ได้อย่างน้อยก็ไม่ได้อยู่ในกล่อง linux ของฉัน
Constantinius

5

ที่จริงฉันคิดว่าไม่มีคำตอบข้างต้นที่แก้ไขปัญหาจริง: เส้นทางข้ามแพลตฟอร์ม สิ่งที่ os.path ทำคือโหลดไลบรารี 'path' เวอร์ชันขึ้นกับระบบปฏิบัติการ ดังนั้นวิธีแก้ไขคือโหลดไลบรารีเส้นทาง (OS) ที่เกี่ยวข้องอย่างชัดเจน:

import ntpath
import posixpath

ntpath.isabs("Z:/a/b/c../../H/I/J.txt")
    True
posixpath.isabs("Z:/a/b/c../../H/I/J.txt")
    False

ใช่ คำถามนี้กล่าวถึงเส้นทางของ windows และ linux โดยเฉพาะ! สายการบินเดียวที่รวดเร็วซึ่งทำงานในการตั้งค่าเกือบทั้งหมด: def path_is_abs(p): return (len(p) > 1) and (p[0] == '/' or p[1] == ':')
Oliver Zendel

4

จากpython 3.4 pathlibสามารถใช้ได้

In [1]: from pathlib import Path

In [2]: Path('..').is_absolute()
Out[2]: False

In [3]: Path('C:/').is_absolute()
Out[3]: True

In [4]: Path('..').resolve()
Out[4]: WindowsPath('C:/the/complete/path')

In [5]: Path('C:/').resolve()
Out[5]: WindowsPath('C:/')

1
คำตอบนี้จริงทำงานบน Windows .. Path('\tmp').is_absolute()ให้ถูกต้องFalseในขณะที่ช่วยให้ไม่ถูกต้องos.path.isabs('\tmp') True(บางคนอาจแย้งว่า\tmpนี่เป็นเส้นทางที่สมบูรณ์แบบบน Windows แต่นั่นเป็นเพียงความจริงสำหรับคำจำกัดความที่ไร้ประโยชน์ของเส้นทางที่แน่นอน )
Zbyl

0

อีกวิธีหนึ่งถ้าคุณไม่ได้อยู่ในไดเรกทอรีการทำงานปัจจุบันเลยสกปรก แต่มันใช้ได้กับฉัน

import re
path = 'my/relative/path'
# path = '..my/relative/path'
# path = './my/relative/path'

pattern = r'([a-zA-Z0-9]|[.])+/'
is_ralative = bool(pattern)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.