エラーは、何が悪かったのかを正確に示しています。パスに書き込む権限がありませんD:/Thesis/test_http_dl
。
これには4つの理由が考えられます。
- その名前のファイルが既にあり、書き込みアクセス権がありません。
- に新しいファイルを作成するためのアクセス権がありません
D:\Thesis
。
- D:ドライブへの書き込みアクセス権はまったくありません(たとえば、CD-ROMであるため)。
- 他のプロセスでは、ファイルを排他的アクセス用に開いています。
ACLD:\Thesis\test_http_dl
が存在するD:\Thesis\
かどうかを確認し、ユーザー(スクリプトを実行しているユーザー)が書き込みアクセス権を持っているかどうかを確認し、そのパスまたはDドライブ自体に「読み取り専用」フラグをオンにし、他のプロセスでファイルが開いているかどうかも確認します。(最後のツールに組み込まれているツールはわかりませんが、handle
sysinternalsからProcess Explorer
簡単に実行できます。)
一方、ここでは、関連するものはまったくありませんurllib2
。これを行うだけで、それを確認できます。
open("D:/Thesis/test_http_dl", "w")
まったく同じ例外が発生します。
例外が何が悪いのかを正確に教えてくれない場合のために、それを「難しい」方法で理解する方法を知ることは価値があります。次のような行で例外が発生します。
open("D:/Thesis/test_http_dl", "w").write(ul)
何かがおかしいです、そしてあなたがそれが何であるかを言うのに十分な情報を持っていないなら、あなたは何をしますか?まず、それを細かく分割して、各行に1つの操作を実行します。
f = open("D:/Thesis/test_http_dl", "w")
f.write(ul)
これで、これら2つのうちどちらが例外になるかがわかりました。
あなたがそれにいる間、このコードが依存するのは、だけなので、これul
をテストするためのより簡単なプログラムを作成することができます:
ul = 'junk'
f = open("D:/Thesis/test_http_dl", "w")
f.write(ul)
それが直接役に立たない場合でも、テストループを通過するたびにダウンロードを待つ必要がなく、SOに投稿するのが簡単なことを意味します(詳細についてはSSCCEを参照)。インタラクティブインタプリタに入力するだけの何か。write
が例外を発生させている理由を確認するために印刷するのに役立つ可能性があるものを推測しようとする代わりに、help(f)
またはで開始しdir(f)
てライブで遊ぶことができます。(この場合、実際にopen
失敗するのは、ではなく、write
推測ですが、推測する必要はありません。)
2番目の問題について:
urllib.urlretrieve()は、フォルダーに1 kbのファイルを作成するだけですが、これは明らかにダウンロードされたファイルではありません。
実はダウンロードしたファイルだと思います。あなたは求めているのではなく、求めてAF_eMTH_NDVI.2012.047-056.QKM.COMPRES.005.2012059143841.zip
いるのですAF_eMTH_NDVI.2012.047-056.QKM.COMPRES.005.2012059143841.zip.sum
、これはおそらくチェックサムファイルです。これは、ダウンロードしているファイルが転送中に破損したり、ハッカーによって改ざんされたりしていないことを確認するのに役立つメタデータを含む準標準タイプのファイルです。一般的なチェックサムファイルには1つ以上の行があり、それぞれがダウンロード可能なファイルをチェックサムまたは暗号化ハッシュダイジェストに何らかの形式でマッピングしてダウンロード可能なファイルにします。チェックサム/ハッシュのタイプ、文字列形式のチェックサム/ハッシュの値、ファイルのファイル名または完全なURLの3つの列がある場合があります。最初の列が省略されることがあり、他の場所からどのタイプのチェックサム/ハッシュが使用されているかを知る必要があります(多くの場合、16進文字列としてのMD5)。列の順序が異なる場合があります。カンマやタブで区切られたり、固定幅のフィールドで区切られたり、その他のバリエーションで区切られたりすることもあります。
いずれにせよ、.sumファイルの長さは約80バイトであると予想されます。エクスプローラーまたはdir
コマンドで表示すると、通常、最も近い1Kに切り上げられます。したがって、これを正常にダウンロードすると、1Kファイルが表示されるはずです。
その間:
print(repr(ul [:60]))は'\ n
これの残りの部分を印刷してみてください。これはおそらく、人間の言葉で、あなたが間違っていることを説明するある種の文書だからです。これは、URLエージェント、優先エンコーディング、リファラー、またはその他のヘッダーを渡す必要があることが原因である可能性があります。
ただし、繰り返し使用したのとまったく同じコード行をテストしましたul
。常に次のようになります。
1ba6437044bfa9259fa2d3da8f95aebd AF_eMTH_NDVI.2012.047-056.QKM.COMPRES.005.2012059143841.zip
つまり、HTMLページではなく、完全に有効なチェックサムファイルです。したがって、実際に起こっているのは、表示しているのと同じコードをテストしていないことだと思います。