[解決済み] Python 3 で Web からファイルをダウンロードする
質問
同じゲーム/アプリケーションの.jadファイルに指定されたURLを読み込んで、Webサーバーから.jar(java)ファイルをダウンロードするプログラムを作成しています。Python 3.2.1を使っています。
JADファイルからJARファイルのURLを抽出することはできましたが(すべてのJADファイルにはJARファイルのURLが含まれています)、ご想像の通り、抽出された値はtype()stringです。
該当の関数はこちらです。
def downloadFile(URL=None):
import httplib2
h = httplib2.Http(".cache")
resp, content = h.request(URL, "GET")
return content
downloadFile(URL_from_file)
しかし、上記の関数の型は文字列ではなく、バイトでなければならないというエラーが常に発生します。URL.encode('utf-8') や bytes(URL,encoding='utf-8') を使ってみましたが、いつも同じか似たようなエラーになります。
つまり、基本的に私の質問は、URLが文字列型で保存されている場合、サーバーからファイルをダウンロードする方法ですか?
どのように解決するのですか?
ウェブページの内容を変数に取得したい場合は、単に
read
の応答は
urllib.request.urlopen
:
import urllib.request
...
url = 'http://example.com/'
response = urllib.request.urlopen(url)
data = response.read() # a `bytes` object
text = data.decode('utf-8') # a `str`; this step can't be used if data is binary
ファイルをダウンロードし、保存する最も簡単な方法は
urllib.request.urlretrieve
関数を使用します。
import urllib.request
...
# Download the file from `url` and save it locally under `file_name`:
urllib.request.urlretrieve(url, file_name)
import urllib.request
...
# Download the file from `url`, save it in a temporary directory and get the
# path to it (e.g. '/tmp/tmpb48zma.txt') in the `file_name` variable:
file_name, headers = urllib.request.urlretrieve(url)
ただし、以下の点に注意してください。
urlretrieve
は
レガシー
で、非推奨になる可能性があります(理由は不明ですが)。
そのため、最も
正しい
を使用することです。
urllib.request.urlopen
関数を使って、HTTP レスポンスを表すファイルのようなオブジェクトを返し、それを実際のファイルにコピーすることができます。
shutil.copyfileobj
.
import urllib.request
import shutil
...
# Download the file from `url` and save it locally under `file_name`:
with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
shutil.copyfileobj(response, out_file)
これがあまりに複雑に思えるなら、もっとシンプルに、ダウンロードしたもの全体を
bytes
オブジェクトを作成し、それをファイルに書き出します。しかし、これは小さなファイルに対してのみうまく機能します。
import urllib.request
...
# Download the file from `url` and save it locally under `file_name`:
with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
data = response.read() # a `bytes` object
out_file.write(data)
を抽出することが可能です。
.gz
(しかし、そのような操作を行うには、おそらくHTTPサーバーがファイルへのランダムアクセスをサポートすることが必要です。
import urllib.request
import gzip
...
# Read the first 64 bytes of the file inside the .gz archive located at `url`
url = 'http://example.com/something.gz'
with urllib.request.urlopen(url) as response:
with gzip.GzipFile(fileobj=response) as uncompressed:
file_header = uncompressed.read(64) # a `bytes` object
# Or do anything shown above using `uncompressed` instead of `response`.
関連
-
Python入門 openを使ったファイルの読み書きの方法
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonでファイルやフォルダを削除する方法は?
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み] _tkinter.TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み】ilocが「IndexError: single positional indexer is out-of-bounds」を出す。
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件
-
[解決済み] 'int'オブジェクトに'__getitem__'属性がない。
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み】IndexError: invalid index to scalar variableを修正する方法
-
[解決済み】NameError: 名前 'self' が定義されていません。
-
[解決済み】Flaskのテンプレートが見つからない【重複あり
-
[解決済み] HTTPでファイルをダウンロードするには?