python - urlparse () på en Windows filordning URI forlader ekstra skråstreg ved start

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg laver en applikation, der skal læses URI'er fra træk-og-slip-indgangen. Jeg forsøger at behandle hver URI med urllib.parse.urlparse().


urlparse() omhandler internetadresser som forventet:


>>> import urllib
>>> urllib.parse.urlparse('https://www.google.com/advanced\_search')
ParseResult(scheme='https', netloc='www.google.com', path='/advanced\_search', params='', query='', fragment='')


Men at bruge det på lokale Windows-filer efterlader et ekstra skråstreg i starten af ​​stien:


>>> urllib.parse.urlparse('file:///C:/Program\%20Files/Python36/LICENSE.txt')
ParseResult(scheme='file', netloc='', path='/C:/Program\%20Files/Python36/LICENSE.txt', params='', query='', fragment='')


Og faktisk fungerer funktioner, der forventer en lokal filsti, ikke synes at kunne lide denne ekstra skråstreg:


>>> from pathlib import Path
>>> Path('/C:/Program\%20Files/Python36/LICENSE.txt').exists()
Traceback (most recent call last):
...
OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect: '\C:\Program\%20Files\Python36\LICENSE.txt'


Jeg kunne kode en særlig sag for mig selv til at håndtere file:///<Windows drive letter>: på en eller anden måde, men som et spørgsmål om renlighed: Er der en bedre Python-funktion til at opdele URI'er generelt, ikke bare URL'er? Eller er der noget andet jeg mangler?


Brug af Python 3.6.1.

Bedste reference


Ved hjælp af urllib.request.url2pathname() på stien komponenten vil stripe begyndelsen skråstreg for Windows. [15]


>>> import urllib
>>> import urllib.request
>>> path = urllib.parse.urlparse('file:///C:/Program\%20Files/Python36/LICENSE.txt').path
>>> path
'/C:/Program\%20Files/Python36/LICENSE.txt'
>>> urllib.request.url2pathname(path)
'C:\Program Files\Python36\LICENSE.txt'


Så min URI-behandling skal bruge url2pathname() på stien, hvis urlparse() resultatets ord er file.





Takket være @eryksuns kommentar, peger på, at pip bruger url2pathname(). Pip viser også, hvordan man generaliserer koden mere til at håndtere Windows UNC-stier, som bruges i ting som Windows Shared Network-mapper. Det ser ud til at UNC-stier kan detekteres, hvis ordningen er 'file', og netloc er ikke tom, og vi skal forudbestille et par tilbageslag, inden vi arbejder med UNC-stien. [16]


>>> parse\_result = urllib.parse.urlparse('file://some-host/Shared Travel Photos/20170312\_112803.jpg')
>>> parse\_result
ParseResult(scheme='file', netloc='some-host', path='/Shared Travel Photos/20170312\_112803.jpg', params='', query='', fragment='')
>>> urllib.request.url2pathname(r'\' + parse\_result.netloc + parse\_result.path)
'\\some-host\Shared Travel Photos\20170312\_112803.jpg'