2015-02-07 49 views
0

我是一個python n00b。我已經下載了URL編碼文件,我想在我的unix系統(Ubuntu 14)上使用它。在Unix中打開URL編碼的文件名

當我嘗試在我的文件上運行某些操作時,系統說該文件不存在。如何將我的文件名更改爲unix可識別的格式?

我下載的一些文件中有空格,所以它們必須用反斜槓和空格表示。以下是我的代碼片段

link = "http://www.stephaniequinn.com/Music/Scheherezade%20Theme.mp3" 

output = open(link.split('/')[-1],'wb') 
output.write(site.read()) 
output.close() 

shutil.copy(link.split('/')[-1], tmp_dir) 

回答

1

您實際上的「鏈接」是URL。 URL是特殊的,不允許包含某些字符,如空格。這些特殊字符仍然可以表示,但採用編碼形式。從特殊字符到這種編碼形式的翻譯通過一個特定的規則集進行,通常稱爲「URL編碼」。如果有興趣,請在這裏閱讀:http://en.wikipedia.org/wiki/Percent-encoding

編碼操作可以顛倒,這就是所謂的解碼。您下載所提及的文件的工具集很可能已經爲您解碼了。在您的鏈接示例中,URL中只有一個特殊字符「%20」,並且這將編碼一個空格。您的下載工具集可能對此進行了解碼,並使用文件名中的實際空格字符將文件保存到文件系統。也就是說,很可能是因爲在文件系統具有以下basename文件:

Scheherezade Theme.mp3 

所以,當你想從內Python中打開該文件,和所有你已經是link,首先需要獲取它的解碼變體。 Python可以使用內置工具解碼URL編碼的字符串。這是你所需要的:

>>> import urllib.parse 
>>> url = "http://www.stephaniequinn.com/Music/Scheherezade%20Theme.mp3" 
>>> urllib.parse.unquote(url) 
'http://www.stephaniequinn.com/Music/Scheherezade Theme.mp3' 
>>> 

這是假設你使用Python 3,那你link對象是一個Unicode對象(類型str在Python 3)。

開始解碼 URL,您可以導出文件名。你的link.split('/')[-1]方法可能在很多情況下工作,但J.F.塞巴斯蒂安的答案提供了一個更可靠的方法。

1

若要從URL中提取的文件名:

#!/usr/bin/env python2 
import os 
import posixpath 
import urllib 
import urlparse 

def url2filename(url): 
    """Return basename corresponding to url. 

    >>> url2filename('http://example.com/path/to/file?opt=1') 
    'file' 
    """ 
    urlpath = urlparse.urlsplit(url).path # pylint: disable=E1103 
    basename = posixpath.basename(urllib.unquote(urlpath)) 
    if os.path.basename(basename) != basename: 
     raise ValueError # refuse 'dir%5Cbasename.ext' on Windows 
    return basename 

例子:

>>> url2filename("http://www.stephaniequinn.com/Music/Scheherezade%20Theme.mp3") 
'Scheherezade Theme.mp3' 

你做需要躲避空間中的文件名,如果你使用一個Python腳本中。

請參閱how to download a file using Python (with a progress report)的完整代碼示例。