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


153

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

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

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

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

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

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

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

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


6
이 답변을 검토 os.path.split할 때 해당 문자열을 제대로 이스케이프하지 않으므로 제대로 작동하지 않습니다.
Jed Smith

잘못 해석 r"d:\stuff\morestuff\furtherdown\THEFILE.txt"되지 않도록 문자열을 이스케이프하거나 rawstring : 을 사용해야 \s합니다.
smci

답변:


164

나는 사람들이 자신의 길 찾기 기능을 작성하고 잘못함으로써 많은 시간을 물었습니다. 공백, 슬래시, 백 슬래시, 콜론-혼란의 가능성은 끝이 없지만 실수는 쉽게 이루어집니다. 그래서 나는의 사용을위한 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. 원하지 않으면 약간의 코드를 잃을 수 있습니다.)


@brone-백 슬래시를 피할 필요가없는 것보다이 솔루션을 사용하는 것이 좋습니다. 감사!
BeeBand

1
기쁘지만, "C : \ usr \ rs0 \ my0 \ in111102.log"와 같은 경로를 사용하면 해결책이 작동하지 않는 것으로 보입니다 (초기 입력이 원시 문자열이 아닌 한) )?
shearichard

1
OSX에 "/ path / to / my / folder /"와 같은 디렉토리 만 포함 된 경우 경로를 올바르게 분할하지 않는 것 같습니다.이 두 줄을 처음에 추가하고 싶을 것입니다. if path.endswith("/"):그리고 path = path[:-1].
케빈 런던

1
나는 @Tompa하여 솔루션을 선호
jaycode

1
나는에 동의 jaycode : 톰파솔루션 입니다 표준 접근 방법과 허용 대답하고 있어야합니다. 이 지나치게 복잡하고 비효율적이며 오류가 발생하기 쉬운 대안은 프로덕션 코드에서 소집을 통과시키지 못합니다. 없어 시도 할 (... 물론 실패) 간단한 문자열 분할 만에 성공하면 반복적으로 경로 이름을 따로 분석 할 합리적인 이유 코드 한 줄은.
Cecil Curry

287

난 그럴거야

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

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


25
하나의 진정한 대답은 : 그것은 등장했다 . 정식 솔루션은 물론 가장 간단합니다. 보다! 그것은 우아하고 엉성하고 가장자리 케이스를 견딜 수 없기 때문입니다.
Cecil Curry 5

20
os.path.normpath(a_path).split(os.path.sep)
Daniel Farrell

2
path = root에서는 작동하지 않는 것 같습니다. 이 경우 path.split의 결과는 [ '', '']입니다. 실제로이 split () 솔루션은 빈 문자열 이름을 가진 가장 왼쪽의 디렉토리를 제공합니다 (해당 슬래시로 대체 될 수 있음). 핵심 문제는 단일 슬래시 (OS에 따라 앞뒤로)는 루트 디렉토리 의 이름 이고 경로의 다른 곳에서는 분리 자 입니다.
gwideman

2
그러면 lstrip으로 더 잘 작동합니까? os.path.normpath(path).lstrip(os.path.sep).split(os.path.sep)
Vidar

1
@ user60561 Linux에서는 백 슬래시가 파일 이름에 허용되는 문자이고 Windows에서는 슬래시가 허용되지 않기 때문입니다. 이것이 Windows에서 normpath슬래시를 구분 기호로 인식하는 이유입니다 . Linux에서는 normpath단순히 디렉토리라고 \1\2하고 그 안에 파일 또는 디렉토리 가 있다고 가정합니다 3.
Vojislav Stojkovic

81

가장 파이썬적인 접근 방식 (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]

22
이 작동합니다 some times. 다른 경우에는 (적어도 Windows에서는) 다음과 같은 경로를 찾을 수 folder\folder2\folder3/file.txt있습니다. 먼저 경로를 정규화 (os.path.normpath) 한 다음 분할하는 것이 좋습니다.
vikki

7
이 대답은 거의 있었다. vikki가 제안한 바와 같이 , 문자열 분할 철자 이전에 경로 이름을 정규화하지 못하면 일반적인 경우 (예 :)에서 파멸됩니다 /foo//bar. 보다 강력한 솔루션 은 Tompa답변 을 참조하십시오 .
Cecil Curry 5

62

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


3
Path.parts는 내가 항상 원했던 것이지만 오늘까지는 존재하지 않았습니다.
JamEnergy 2016 년

왜 이것이 훌륭한 네이티브 파이썬 함수로 둘러싸이지 않았습니까?
Eduardo Pignatelli

2
그게 답입니다!
nayriz

11

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

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

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


@W. Craig Trader-감사합니다. 그러나이 경로는 제가 생성 한 경로가 아닙니다. 다른 프로그램에서 다시 나와서이 데이터를 변수에 저장해야합니다. 변수에 저장된 데이터를 "원시 텍스트"로 변환하는 방법을 잘 모르겠습니다.
BeeBand

"원시 텍스트"와 같은 것은 없습니다. 소스에서이를 표현하는 방법 일뿐입니다. r ""를 문자열 앞에 추가하거나 .replace ( '\\', '/')를 통해 전달하십시오.
Marco Mariani

@ BeeBand, 다른 프로그램에서 데이터를 어떻게 다시 얻습니까? 파일, 파이프, 소켓에서 읽고 있습니까? 그렇다면 멋진 일을 할 필요가 없습니다. 백 슬래시를 두 배로 늘리거나 원시 문자열을 사용하는 유일한 이유는 문자열 상수를 Python 코드에 배치하는 것입니다. 반면에, 다른 프로그램이 이중 백 슬래시를 생성하는 경우 경로를 분할하기 전에 해당 파일을 정리해야합니다.
Craig Trader

@W. Craig Trader-다른 프로그램에서 작성한 파일에서 읽습니다. 어떤 이유로 얻을 수 split()없거나 replace()일할 수 없었습니다 . 16 진수 값을 계속 얻었습니다. 당신은 옳습니다. 나는 원시 문자열 아이디어로 잘못된 나무를 짖고 있다고 생각합니다. 나는 잘못 사용하고 있다고 생각 split()합니다. 나는이 솔루션 중 일부를 사용하여 시도했지만 split()지금은 나를 위해 일합니다.
BeeBand

10

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

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

이것이이 문제에 대한 내가 가장 좋아하는 솔루션입니다. 아주 좋아요
Will Moore

1
경로가로 끝나는 경우 작동하지 않습니다 /. 또한 경로가 다음으로 시작하면 목록의 시작 부분에 빈 문자열이 표시됩니다./
Sorig

4

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


4

발전기 와 함께 기능적인 방법 .

def split(path):
    (drive, head) = os.path.splitdrive(path)
    while (head != os.sep):
        (head, tail) = os.path.split(head)
        yield tail

실제로 :

>>> print([x for x in split(os.path.normpath('/path/to/filename'))])
['filename', 'to', 'path']

3

그것은 나를 위해 작동합니다 :

>>> a=r"d:\stuff\morestuff\furtherdown\THEFILE.txt"
>>> a.split("\\")
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

물론 첫 번째 구성 요소에서 콜론을 제거해야하지만 경로를 다시 어셈블 할 수 있습니다.

r수정 마크 "원시"와 같은 문자열 리터럴; 포함 된 백 슬래시가 두 배가되지 않는 방법에 주목하십시오.


@unwind- r문자열 앞에 무엇을 의미합니까?
BeeBand

2
r은 원시 문자열을 의미하며 \ 문자를 자동 이스케이프 합니다. 경로를 할 때마다 사용하는 것이 좋습니다.
Wayne Werner

1
@BeeBand : 신경 쓰지 않아도됩니다. r ""은 코드를 컴파일 / 파싱하는 동안 중요한 일이며, 일단 구문 분석 된 문자열의 속성이되는 것은 아닙니다. "문자열 리터럴이 있지만 백 슬래시가 아닌 다른 의미를 갖는 것으로 백 슬래시를 해석하지 않음"을 의미합니다.
언 와인드

3
하드 코딩 대신 a.split (os.sep)을 사용하여 더 모호한 것을 언급하는 것이 도움이 될 수 있다고 생각합니까?
Tim McJilton

4
나는 설명 할 수있는 기회를 누락을 downvote해야 os.path.split하고 os.pathsep훨씬 더 휴대용 당신이 쓴 것보다 그 모두를 고려. 이제는 OP가 중요하지 않을 수도 있지만 플랫폼을 이동 해야하는 것을 작성할 때 가능합니다.
Jed Smith

3

에 관한 내용 mypath.split("\\")은로 표현하는 것이 좋습니다 mypath.split(os.sep). sep특정 플랫폼 (예 : \Windows, /Unix 등) 의 경로 구분 기호이며 Python 빌드는 사용할 플랫폼을 알고 있습니다. 를 사용하면 sep코드가 플랫폼에 구애받지 않습니다.


1
또는 os.path.split. OS X의 Python 버전에 있으므로 (을 올바르게 처리 os.pathsep하기 때문에) 조심 해야합니다 . :os.path.split/
Jed Smith

4
당신은 os.sep아니에요 os.pathsep. os.sep문서 의 지혜를 따르십시오. 이것이 경로 이름을 구문 분석하거나 연결할 수있는 것만으로는 충분하지 않습니다. os.path.split () 및 os.path.join ()을 사용하십시오.
Jon-Eric

1

re.split ()은 string.split ()보다 조금 더 도움이 될 수 있습니다

import re    
var = "d:\stuff\morestuff\furtherdown\THEFILE.txt"
re.split( r'[\\/]', var )
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

Linux 및 Mac 경로도 지원하려면 filter (None, result)를 추가하면 경로가 '/'또는 '//'로 시작하므로 split ()에서 원하지 않는 ''를 제거합니다. 예를 들어 '// mount / ...'또는 '/ var / tmp /'

import re    
var = "/var/stuff/morestuff/furtherdown/THEFILE.txt"
result = re.split( r'[\\/]', var )
filter( None, result )
['var', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

1

os.path.split문자열을 재귀 적으로 사용할 수 있습니다

import os
def parts(path):
    p,f = os.path.split(path)
    return parts(p) + [f] if f else [p]

일부 경로 문자열에 대해 이것을 테스트하고 다음을 사용하여 경로를 다시 어셈블하십시오. os.path.join

>>> for path in [
...         r'd:\stuff\morestuff\furtherdown\THEFILE.txt',
...         '/path/to/file.txt',
...         'relative/path/to/file.txt',
...         r'C:\path\to\file.txt',
...         r'\\host\share\path\to\file.txt',
...     ]:
...     print parts(path), os.path.join(*parts(path))
... 
['d:\\', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt'] d:\stuff\morestuff\furtherdown\THEFILE.txt
['/', 'path', 'to', 'file.txt'] /path\to\file.txt
['', 'relative', 'path', 'to', 'file.txt'] relative\path\to\file.txt
['C:\\', 'path', 'to', 'file.txt'] C:\path\to\file.txt
['\\\\', 'host', 'share', 'path', 'to', 'file.txt'] \\host\share\path\to\file.txt

드라이브 문자, UNC 경로 및 절대 및 상대 경로를 처리하려는 방법에 따라 목록의 첫 번째 요소를 다르게 처리해야 할 수도 있습니다. 마지막 [p]을 변경하면 [os.path.splitdrive(p)]드라이브 문자와 디렉토리가 튜플로 분리되어 문제가 발생합니다.

import os
def parts(path):
    p,f = os.path.split(path)
    return parts(p) + [f] if f else [os.path.splitdrive(p)]

[('d:', '\\'), 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
[('', '/'), 'path', 'to', 'file.txt']
[('', ''), 'relative', 'path', 'to', 'file.txt']
[('C:', '\\'), 'path', 'to', 'file.txt']
[('', '\\\\'), 'host', 'share', 'path', 'to', 'file.txt']

편집 : 나는이 답변이 user1556435에 의해 위에서 주어진 것과 매우 유사하다는 것을 깨달았습니다 . 경로의 드라이브 구성 요소 처리가 다르기 때문에 대답을 남기고 있습니다.


0

다른 사람들이 설명했듯이 문제 \는 문자열 리터럴 / 상수의 이스케이프 문자 인 을 사용하여 발생했습니다 . OTOH, 다른 소스 (파일, 콘솔에서 읽거나 os 함수로 반환)에서 해당 파일 경로 문자열을 가지고 있다면 '\\'또는 r '\'에서 분할하는 데 문제가 없었을 것입니다.

사용하고자하는 경우 그리고 다른 사람이 제안처럼, \프로그램 문자에, 당신은 그것을 복제 중 하나에있는 \\또는 전체 문자가 접두어로하는 r과 같이, r'lite\ral'또는 r"lite\ral"그 변환 파서 피하기 위해 \rCR에 (캐리지 리턴) 문자를.

\코드에 백 슬래시 경로 이름을 사용하지 마십시오 ! 지난 세기부터 Windows는 슬래시를 디렉토리 구분 기호로 사용하는 경로 이름을 인식하고 올바르게 작동합니다 /! 어쨌든 많은 사람들이 그것을 알지 못하지만 작동합니다.

>>> var = "d:/stuff/morestuff/furtherdown/THEFILE.txt"
>>> var.split('/')
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

그런데 이것은 /미리 정의 된 상수 상수를 사용하지 않더라도 모든 코드 가 디렉토리 구분 기호로 사용되기 때문에 Unix, Windows 및 Mac에서 코드가 작동 하게합니다 os.


불행히도 파이썬 스크립트에서 실행하는 다른 프로그램에서 데이터가 반환됩니다. '\'또는 '/'를 사용할지 여부를 제어 할 수 없습니다.이를 결정하는 타사 프로그램입니다 (아마도 플랫폼 기준).
BeeBand

@BeeBand : 아, 그러면 프로그램에서 문자열을 리터럴로 제공했을 때 테스트하는 동안 경험 한 문제가 없습니다. 또는 경로를받은 후 다음과 같은 악한 해킹을 수행 할 수 있습니다 : var = var.replace('\\','/')-\를 /로 바꾸고 슬래시로만 진행하십시오 :)
Nas Banov

그것은 실제로 악한 해킹입니다 : o)
BeeBand

@ BeeBand : 이것이 내가 경고 한 이유입니다. 내가 뭔가 악하다고 말할 때 반드시 사용해서는 안된다는 것을 의미하지는 않습니다. 그러나 왜 그들이 그것을 사용하고 있고 의도하지 않은 결과에 대해 경고 해야하는지 매우 많이 알아야합니다. 이 경우, 매우 드물게 결과는 이것이 파일 또는 디렉토리 이름에서 사용 (
유일

0

filedata.txt컨텐츠 가있는 파일이 있다고 가정하십시오 .

d:\stuff\morestuff\furtherdown\THEFILE.txt
d:\otherstuff\something\otherfile.txt

파일 경로를 읽고 분할 할 수 있습니다.

>>> for i in open("filedata.txt").readlines():
...     print i.strip().split("\\")
... 
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
['d:', 'otherstuff', 'something', 'otherfile.txt']

이것은 실제로 작동합니다, 감사합니다! 그러나 백 슬래시 탈출에 대해 걱정하지 않기 때문에 brone의 솔루션을 선택했습니다.
BeeBand

9
파일 시스템에 의존하기 때문에 pythonic이 아닙니다.
jb.

0

os.path.basename 함수를 사용하기 때문에 다음을 사용합니다. 반환 된 목록에 슬래시를 추가하지 않습니다. 그것은 또한 모든 플랫폼의 슬래시와도 작동합니다 : 즉, 창 \\ 또는 유닉스 / /. 또한 Windows가 서버 경로에 사용하는 \\\\를 추가하지 않습니다. :)

def SplitPath( split_path ):
    pathSplit_lst   = []
    while os.path.basename(split_path):
        pathSplit_lst.append( os.path.basename(split_path) )
        split_path = os.path.dirname(split_path)
    pathSplit_lst.reverse()
    return pathSplit_lst

따라서 '\\\\ server \\ folder1 \\ folder2 \\ folder3 \\ folder4'

당신은 얻을

[ '서버', '폴더 1', '폴더 2', '폴더 3', '폴더 4']


1
결과를 전달할 os.path.join()때 원래 문자열을 반환해야하는 불변을 따르지 않습니다 . 귀하의 예제 입력에 대한 올바른 출력은 [r'\\','server','folder1','folder2','folder3','folder4']입니다. 즉 무엇을 하는가 os.path.split().
Jon-Eric

0

실제로 이것이 질문에 완전히 대답하는지 확실하지 않지만 스택을 유지하고 os.path 기반 조작을 고수하고 항목의 목록 / 스택을 반환하는이 작은 함수를 작성하는 것은 즐거운 시간을 보냈습니다.

  9 def components(path):
 10     ret = []
 11     while len(path) > 0:
 12         path, crust = split(path)
 13         ret.insert(0, crust)
 14
 15     return ret
 16

0

아래 코드 줄은 다음을 처리 할 수 ​​있습니다.

  1. C : / 경로 / 경로
  2. C : // 경로 // 경로
  3. C : \ 경로 \ 경로
  4. C : \ 경로 \ 경로

경로 = re.split (r '[/// \]', 경로)


0

재미를위한 재귀.

가장 우아한 답변은 아니지만 모든 곳에서 작동해야합니다.

import os

def split_path(path):
    head = os.path.dirname(path)
    tail = os.path.basename(path)
    if head == os.path.dirname(head):
        return [tail]
    return split_path(head) + [tail]

실로 미안합니다. 'dos'경로라는 질문을주의 깊게 읽어야합니다.
DuGNu

-1

사용하다 ntpath.split()


os.path.split ()을 사용하면 다음과 같은 결과를 얻습니다. ( d:\\stuff, morestuff\x0curtherdown\thefile.mux)
BeeBand

BeeBand가 지적했듯이 os.path.split ()은 실제로 원하는 것을 수행하지 않습니다.
언 와인드

죄송합니다. os.path가 운영 체제에 따라 작동한다는 것을 깨달았습니다. ntpath는 dos 경로를 구문 분석합니다.
deft_code

ntpath를 사용해도 여전히 얻을 수 있습니다d:\\stuff, morestuff\x0curtherdown\thefile.mux
BeeBand

2
@ BeeBand : 문자열을 이스케이프 처리하는 데 문제가 있습니다. '\x0c'양식 피드 문자입니다. 용지 공급 문자를 만드는 방법은 '\ f'입니다. 리터럴 문자열 '\ f'를 정말로 원한다면 두 가지 옵션이 있습니다. '\\f'또는 r'\f'.
deft_code
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.