5

os.normpathに変換するためhttp://example.com/a/b/c/../に使用しようとしましhttp://example.com/a/b/たが、スラッシュをバックスラッシュに変換するため、Windows では機能しません。

4

3 に答える 3

8

ここにそれを行う方法があります

>>> import urlparse
>>> urlparse.urljoin("ftp://domain.com/a/b/c/d/", "../..")
'ftp://domain.com/a/b/'
>>> urlparse.urljoin("ftp://domain.com/a/b/c/d/e.txt", "../..")
'ftp://domain.com/a/b/'    

urljoin最後までパス/ディレクトリを考慮することを忘れないでください/。これ以降はファイル名です。

また、2 番目のパラメーターに先頭/を追加しないでください。そうしないと、期待される結果が得られません。

os.pathモジュールはプラットフォームに依存しますが、ファイル パスにはスラッシュのみを使用し、URL は使用できませんposixpath,normpath

于 2010-01-25T09:33:59.870 に答える
7

仕事urljoinposixpath.normpathちゃんとしないurljoin何かに参加することを強制し、絶対パスまたは過剰な..s を正しく処理しません。posixpath.normpath複数のスラッシュを折りたたみ、末尾のスラッシュを削除します。どちらも URL で行うべきではありません。


次の関数は、URL を完全に解決し、RFC 3986に従って正しい方法で.との両方を処理します。..

try:
    # Python 3
    from urllib.parse import urlsplit, urlunsplit
except ImportError:
    # Python 2
    from urlparse import urlsplit, urlunsplit

def resolve_url(url):
    parts = list(urlsplit(url))
    segments = parts[2].split('/')
    segments = [segment + '/' for segment in segments[:-1]] + [segments[-1]]
    resolved = []
    for segment in segments:
        if segment in ('../', '..'):
            if resolved[1:]:
                resolved.pop()
        elif segment not in ('./', '.'):
            resolved.append(segment)
    parts[2] = ''.join(resolved)
    return urlunsplit(parts)

次に、次のように完全な URL で呼び出すことができます。

>>> resolve_url("http://example.com/dir/../../thing/.")
'http://example.com/thing/'

URL を解決する際に考慮する必要がある考慮事項の詳細については、この件に関して以前に書いた同様の回答を参照してください。

于 2016-11-10T21:19:35.097 に答える
2

os モジュールから採用 - os.path はモジュール posixpath または ntpath の 1 つです。この場合、明示的に posixpath を使用します。

   >>> import posixpath
    >>> posixpath.normpath("/a/b/../c")
    '/a/c'
    >>> 
于 2010-01-25T09:37:47.507 に答える