31

urllib2 を使用してファイルを開くと、次のようになります。

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

元の URL を解析する以外にファイル名を取得する簡単な方法はありますか?

編集: openfile を urlopen に変更しました...それがどのように起こったのかわかりません。

EDIT2:私は使用してしまった:

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

私が間違っていない限り、これにより、潜在的なクエリもすべて取り除かれます。

4

14 に答える 14

49

urllib2.urlopen のことですか?

サーバーが をチェックして Content-Disposition ヘッダーを送信していた場合、意図したファイル名を持ち上げることができますが、そのままでは、URL を解析するだけでよいと思います。remotefile.info()['Content-Disposition']

を使用することもできますurlparse.urlsplitが、2 番目の例のような 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'
于 2008-10-02T15:43:12.970 に答える
13

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 またはファイル パスの最後の部分のみが返されるため、これについて心配する必要はありません。

于 2008-10-02T16:06:16.720 に答える
7

http転送に関しては、「ファイル名」はあまり明確に定義された概念ではないと思います。サーバーは「content-disposition」ヘッダーとして提供する場合があります (必須ではありません) remotefile.headers['Content-Disposition']。これが失敗した場合は、おそらく URI を自分で解析する必要があります。

于 2008-10-02T15:43:10.130 に答える
6

普段やってるこれ見たけど..

filename = url.split("?")[0].split("/")[-1]
于 2015-03-20T18:38:47.497 に答える
2

また、最も評価の高い 2 つの回答の両方を組み合わせることもできます。

完全なコードは次のようになります。

>>> remotefile=urllib2.urlopen(url)
>>> try:
>>>   filename=remotefile.info()['Content-Disposition']
>>> except KeyError:
>>>   filename=os.path.basename(urllib2.urlparse.urlsplit(url).path)
于 2016-04-28T14:41:39.770 に答える
2

ということurllib2.urlopenですか?モジュールopenfileで呼び出される関数はありません。urllib2

とにかく、urllib2.urlparse関数を使用します。

>>> from urllib2 import urlparse
>>> print urlparse.urlsplit('http://example.com/somefile.zip')
('http', 'example.com', '/somefile.zip', '', '')

出来上がり。

于 2008-10-02T15:42:59.867 に答える
1

解析の意味に依存すると思います。URL を解析せずにファイル名を取得する方法はありません。つまり、リモート サーバーはファイル名を提供しません。ただし、自分で多くのことを行う必要はありません。次のurlparseモジュールがあります。

In [9]: urlparse.urlparse('http://example.com/somefile.zip')
Out[9]: ('http', 'example.com', '/somefile.zip', '', '', '')
于 2008-10-02T15:45:47.147 に答える
1

私が知っていることではありません。

しかし、次のように簡単に解析できます。

url = 'http://example.com/somefile.zip'
print url.split('/')[-1]

于 2008-10-02T15:46:49.670 に答える
0

オペレーティング システムに依存せず、URL を適切に処理するPurePosixPathを使用することが Pythonic ソリューションです。

>>> from pathlib import PurePosixPath
>>> path = PurePosixPath('http://example.com/somefile.zip')
>>> path.name
'somefile.zip'
>>> path = PurePosixPath('http://example.com/nested/somefile.zip')
>>> path.name
'somefile.zip'

ここにネットワーク トラフィックがないことに注意してください (つまり、これらの URL はどこにも行きません)。標準の解析ルールを使用しているだけです。

于 2016-04-11T19:28:35.967 に答える
0
import os,urllib2
resp = urllib2.urlopen('http://www.example.com/index.html')
my_url = resp.geturl()

os.path.split(my_url)[1]

# 'index.html'

これはオープンファイルではありませんが、それでも役立つかもしれません:)

于 2008-10-02T15:45:48.580 に答える