[python] 파이썬에서 dos 경로를 구성 요소로 분할하는 방법

dos 경로를 나타내는 문자열 변수가 있습니다.

var = "d:\stuff\morestuff\furtherdown\THEFILE.txt"

이 문자열을 다음과 같이 나누고 싶습니다.

[ "d", "stuff", "morestuff", "furtherdown", "THEFILE.txt" ]

내가 사용하는 시도 split()하고 replace()있지만, 어느 단지 문자열로 진수 번호 삽입 최초의 백 슬래시 또는를 처리합니다.

어떻게 든이 문자열 변수를 원시 문자열로 변환하여 구문 분석 할 수 있어야합니다.

가장 좋은 방법은 무엇입니까?

또한 var구문 분석하려는 경로 의 내용 이 실제로 명령 줄 쿼리의 반환 값임을 추가해야합니다. 내가 생성하는 경로 데이터가 아닙니다. 파일에 저장되며 명령 행 도구는 백 슬래시를 이스케이프하지 않습니다.



답변

나는 사람들이 자신의 길 찾기 기능을 작성하고 잘못함으로써 많은 시간을 물었습니다. 공백, 슬래시, 백 슬래시, 콜론-혼란의 가능성은 끝이 없지만 실수는 쉽게 이루어집니다. 그래서 나는의 사용을위한 stickler이며 os.path, 그것을 기반으로 추천합니다.

(그러나 미덕으로가는 길은 가장 쉬운 길은 아니며, 이것을 발견 할 때 많은 사람들이 미묘한 길을 바로 저주로가는 유혹에 빠지기를 원합니다. 그들은 언젠가는 모든 것이 무너져 내린다는 것을 깨닫지 못할 것입니다. , 아마도 다른 누군가-왜 모든 것이 잘못되었는지를 해결해야하며 누군가 슬래시와 백 슬래시를 혼합하는 파일 이름을 만든 것으로 밝혀졌습니다. 그리고 어떤 사람은 대답이 “그렇지 않다”고 제안합니다. 슬래시와 백 슬래시를 혼합 한 사람을 제외하고 원하는 경우 가능할 수 있습니다.)

다음과 같이 드라이브 및 경로 + 파일을 얻을 수 있습니다.

drive, path_and_file = os.path.splitdrive(path)

경로와 파일을 가져옵니다.

path, file = os.path.split(path_and_file)

개별 폴더 이름을 얻는 것이 특히 편리하지는 않지만 나중에 실제로 잘 작동하는 것을 찾는 즐거움을 높이는 정직한 중간 불편 함입니다.

folders = []
while 1:
    path, folder = os.path.split(path)

    if folder != "":
        folders.append(folder)
    else:
        if path != "":
            folders.append(path)

        break

folders.reverse()

(이것은 경로가 원래 절대라면 "\"시작 부분에 나타납니다 folders. 원하지 않으면 약간의 코드를 잃을 수 있습니다.)


답변

난 그럴거야

import os
path = os.path.normpath(path)
path.split(os.sep)

먼저 경로 문자열을 OS에 적합한 문자열로 정규화하십시오. 그런 다음 os.sep문자열 함수 분할에서 구분 기호로 사용하기에 안전해야합니다.


답변

가장 파이썬적인 접근 방식 (IMHO)을 간단히 사용할 수 있습니다.

import os

your_path = r"d:\stuff\morestuff\furtherdown\THEFILE.txt"
path_list = your_path.split(os.sep)
print path_list

어느 것이 당신에게 줄 것입니까?

['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

여기서 단서는 시스템을 독립적으로 만들기 때문에 또는 os.sep대신에 사용하는 것입니다 .'\\''/'

드라이브 문자에서 콜론을 제거하려면 (내가 원하는 이유는 보이지 않지만) 다음과 같이 쓸 수 있습니다.

path_list[0] = path_list[0][0]


답변

Python> = 3.4에서 이것은 훨씬 간단 해졌습니다. 이제 pathlib.Path.parts경로의 모든 부분을 얻는 데 사용할 수 있습니다 .

예:

>>> from pathlib import Path
>>> Path('C:/path/to/file.txt').parts
('C:\\', 'path', 'to', 'file.txt')
>>> Path(r'C:\path\to\file.txt').parts
('C:\\', 'path', 'to', 'file.txt')

Python 3의 Windows 설치에서는 Windows 경로를 사용한다고 가정하고 * nix에서는 posix 경로를 사용한다고 가정합니다. 이것은 일반적으로 원하는 것이지만 그렇지 않은 경우 클래스를 사용 pathlib.PurePosixPath하거나 pathlib.PureWindowsPath필요에 따라 사용할 수 있습니다 .

>>> from pathlib import PurePosixPath, PureWindowsPath
>>> PurePosixPath('/path/to/file.txt').parts
('/', 'path', 'to', 'file.txt')
>>> PureWindowsPath(r'C:\path\to\file.txt').parts
('C:\\', 'path', 'to', 'file.txt')
>>> PureWindowsPath(r'\\host\share\path\to\file.txt').parts
('\\\\host\\share\\', 'path', 'to', 'file.txt')

편집 : 파이썬 2에 대한 백 포트도 있습니다 : pathlib2


답변

여기서 문제는 처음에 문자열을 만드는 방법으로 시작됩니다.

a = "d:\stuff\morestuff\furtherdown\THEFILE.txt"

이 방법을 완료, 파이썬은 특별한 경우 이들에 노력하고있다 \s, \m, \f,와 \T. 귀하의 경우 \f다른 백 슬래시가 올바르게 처리되는 동안 용지 공급 (0x0C)으로 처리됩니다. 당신이해야 할 일은 다음 중 하나입니다.

b = "d:\\stuff\\morestuff\\furtherdown\\THEFILE.txt"      # doubled backslashes
c = r"d:\stuff\morestuff\furtherdown\THEFILE.txt"         # raw string, no doubling necessary

그런 다음 이들 중 하나를 분리하면 원하는 결과를 얻을 수 있습니다.


답변

다소 간결한 솔루션을 위해 다음을 고려하십시오.

def split_path(p):
    a,b = os.path.split(p)
    return (split_path(a) if len(a) and len(b) else []) + [b]


답변

나는 실제로 이것에 대한 진정한 대답을 할 수는 없지만 (내가 여기에 있기를 바라고 있기 때문에) 나에게 다른 접근법의 수와 언급 된 모든주의 사항은 파이썬의 os.path 모듈이 절실히 필요하다는 것을 나타내는 가장 확실한 지표입니다 내장 함수로.