当前位置:  开发笔记 > 编程语言 > 正文

urllib2文件名

如何解决《urllib2文件名》经验,为你挑选了4个好方法。

如果我使用urllib2打开文件,如下所示:

remotefile = urllib2.urlopen('http://example.com/somefile.zip')

有没有一种简单的方法来获取文件名,然后解析原始URL?

编辑:将openfile更改为urlopen ...不确定是怎么回事.

编辑2:我最终使用:

filename = url.split('/')[-1].split('#')[0].split('?')[0]

除非我弄错了,否则这也应该删除所有潜在的查询.



1> Jonny Buchan..:

你的意思是urllib2.urlopen?

如果服务器通过检查发送Content-Disposition标头,您可能会提升预期的文件名,但因为我认为您只需要解析该URL.remotefile.info()['Content-Disposition']

您可以使用urlparse.urlsplit,但如果您有任何类似于第二个示例的URL,您最终还是必须自己提取文件名:

>>> urlparse.urlsplit('http://example.com/somefile.zip')
('http', 'example.com', '/somefile.zip', '', '')
>>> urlparse.urlsplit('http://example.com/somedir/somefile.zip')
('http', 'example.com', '/somedir/somefile.zip', '', '')

不妨这样做:

>>> 'http://example.com/somefile.zip'.split('/')[-1]
'somefile.zip'
>>> 'http://example.com/somedir/somefile.zip'.split('/')[-1]
'somefile.zip'


我会*总是*使用urlsplit()而不是直接字符串拆分.如果你有一个附加了片段或查询的URL,后者会阻塞,比如http://example.com/filename.html?cookie=55#Section_3.
使用posixpath.basename()而不是手动拆分'/'.

2> Jay..:

如果您只想要文件名本身,假设最后没有查询变量,如http://example.com/somedir/somefile.zip?foo=bar,那么您可以使用os.path.basename:

[user@host]$ python
Python 2.5.1 (r251:54869, Apr 18 2007, 22:08:04) 
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.path.basename("http://example.com/somefile.zip")
'somefile.zip'
>>> os.path.basename("http://example.com/somedir/somefile.zip")
'somefile.zip'
>>> os.path.basename("http://example.com/somedir/somefile.zip?foo=bar")
'somefile.zip?foo=bar'

其他一些海报提到使用urlparse,这将起作用,但你仍然需要从文件名中删除前导目录.如果使用os.path.basename(),那么您不必担心,因为它只返回URL或文件路径的最后部分.


使用`os.path`来解析URL似乎依赖于当前的操作系统拆分路径,就像拆分URL一样.我不认为每个操作系统都能保证.

3> Rafał Dowgir..:

我认为"文件名"在http传输方面并不是一个定义明确的概念.服务器可能(但不是必须)提供一个"content-disposition"标头,您可以尝试使用它remotefile.headers['Content-Disposition'].如果失败,您可能必须自己解析URI.



4> 小智..:

刚刚看到我通常做的..

filename = url.split("?")[0].split("/")[-1]

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有