我是一个python n00b。我已下载URL编码文件,我想在我的unix系统(Ubuntu 14)上使用它。
当我尝试在我的文件上运行某些操作时,系统会说该文件不存在。如何将文件名更改为可识别的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)
答案 0 :(得分: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对象(在Python 3中键入str
)。
从已解码 URL开始,您可以派生文件名。您的link.split('/')[-1]
方法在许多情况下可能有效,但J.F.Sebastian的回答提供了更可靠的方法。
答案 1 :(得分:1)
从网址中提取文件名:
#!/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)上的完整代码示例。