0

いくつかのファイルをダウンロードする必要があります。私はPythonで次のコードを試しました。

import urllib2
ul = urllib2.urlopen('http://dds.cr.usgs.gov/emodis/Africa/historical/TERRA/2012/comp_056/AF_eMTH_NDVI.2012.047-056.QKM.COMPRES.005.2012059143841.zip.sum').read()
open("D:/Thesis/test_http_dl", "w").write(ul)

このエラーがスローされます:

IOError: [Errno 13] Permission denied: 'D:/Thesis/test_http_dl'

それがなぜなのか分かりますか?私は何か間違ったことをしていますか?
別のフォルダを試しましたが、機能しませんでした。私のフォルダは読み取り専用ではありません。の結果はprint(repr(ul[:60]))です'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n<htm'
urllib.urlretrieve()フォルダに1kbのファイルを作成するだけですが、これは明らかにダウンロードされたファイルではありません。

4

3 に答える 3

2

エラーは、何が悪かったのかを正確に示しています。パスに書き込む権限がありませんD:/Thesis/test_http_dl

これには4つの理由が考えられます。

  1. その名前のファイルが既にあり、書き込みアクセス権がありません。
  2. に新しいファイルを作成するためのアクセス権がありませんD:\Thesis
  3. D:ドライブへの書き込みアクセス権はまったくありません(たとえば、CD-ROMであるため)。
  4. 他のプロセスでは、ファイルを排他的アクセス用に開いています。

ACLD:\Thesis\test_http_dlが存在するD:\Thesis\かどうかを確認し、ユーザー(スクリプトを実行しているユーザー)が書き込みアクセス権を持っているかどうかを確認し、そのパスまたはDドライブ自体に「読み取り専用」フラグをオンにし、他のプロセスでファイルが開いているかどうかも確認します。(最後のツールに組み込まれているツールはわかりませんが、handlesysinternalsから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ページではなく、完全に有効なチェックサムファイルです。したがって、実際に起こっているのは、表示しているのと同じコードをテストしていないことだと思います。

于 2012-12-20T00:27:16.627 に答える
0

私はあなたのコードを試してみましたが、同じエラーが発生しました

だからこれを試してください:D

import urllib
urllib.urlretrieve('http://dds.cr.usgs.gov/emodis/Africa/historical/TERRA/2012/comp_056/AF_eMTH_NDVI.2012.047-056.QKM.COMPRES.005.2012059143841.zip.sum','C:\\path_of_your_folder\\xx.zip.sum')

私と一緒にうまくいきます!

于 2012-12-20T00:34:37.897 に答える
0
import urllib2
def download(url, file):
    dataset = urllib2.urlopen(url)
    CHUNK = 16 * 1024
    with open(file, 'wb') as dl:
        while True:
            peice = dataset.read(CHUNK)
            if not peice: break
            dl.write(peice)

download(r'http://dds.cr.usgs.gov/emodis/Africa/historical/TERRA/2012/comp_056/AF_eMTH_NDVI.2012.047-056.QKM.COMPRES.005.2012059143841.zip',r'AF_eMTH_NDVI.2012.047-056.QKM.COMPRES.005.2012059143841.zip') 
于 2012-12-20T13:55:43.553 に答える