2012-01-11 14 views
2

インストールされているバージョンのCalibreを自動的に更新するスクリプトを作成中です。現在私は最新のポータブル版をダウンロードしています。私はzipファイルを保存するのに問題があるようです。現在、私のコードは次のとおりです。ダウンロードしたZIPファイルをPythonで保存する

import urllib2 
import re 
import zipfile 

#tell the user what is happening 
print("Calibre is Updating") 

#download the page 
url = urllib2.urlopen ("http://sourceforge.net/projects/calibre/files").read() 

#determin current version 
result = re.search('title="/[0-9.]*/([a-zA-Z\-]*-[0-9\.]*)', url).groups()[0][:-1] 

#download file 
download = "http://status.calibre-ebook.com/dist/portable/" + result 
urllib2.urlopen(download) 

#save 
output = open('install.zip', 'w') 
output.write(zipfile.ZipFile("install.zip", "")) 
output.close() 
+0

をしようと試みたがありますか? –

+0

ダウンロードを開始するたびに、エラーが報告されます。なぜ私は分からない。 – Jacobm001

+0

@ Jacobm001:あなたが望むものの簡単な説明を提供し、あなたのコードがやると予想して、あなたが得ているエラーメッセージを含めると役に立ちます。コード内でプログラミングエラーを見つけ出すのはかなり簡単ですが、プログラムで何をしたいのかが完全にはっきりしていないので、エラーが問題の解決に関連しているのか、 –

答えて

5

あなたはこのためzipfile.ZipFile使用する必要はありません(とあなたがそれを使用している方法と同様に、urllib2.urlopenを、同様の問題を持っています)。代わりに、urlopenの結果を変数に保存してからreadとし、その出力を.zipファイルに書き込む必要があります。このコードを試してみてください。

#download file 
download = "http://status.calibre-ebook.com/dist/portable/" + result 
request = urllib2.urlopen(download) 

#save 
output = open("install.zip", "w") 
output.write(request.read()) 
output.close() 
+1

出力= open( "install.zip"、 "w") もちろん – alrusdi

+0

もちろん、ありがたいです。 –

+0

私はあなたの方法を試しましたが、私はそれに問題が発生しているようです。ファイルを正常にダウンロードしますが、完成したファイルを開こうとすると、ファイルが破損していると表示されます。何か案は? 編集:あなたの方法を使用しているファイルが、意図したzipファイルよりも200KBも大きくないことに気がつきました。 – Jacobm001

2

あなただけのネットからファイルをダウンロードしたい場合は、urllib.urlretrieveを使用することができます。

コピーし、ローカルファイルへのURLで表されるネットワーク上のオブジェクト...

requests代わりに urllib2を用い

例:

import requests, re, urllib 

print("Calibre is updating...") 
content = requests.get("http://sourceforge.net/projects/calibre/files").content 

# determine current version 
v = re.search('title="/[0-9.]*/([a-zA-Z\-]*-[0-9\.]*)', content).groups()[0][:-1] 
download_url = "http://status.calibre-ebook.com/dist/portable/{0}".format(v) 

print("Downloading {0}".format(download_url)) 
urllib.urlretrieve(download_url, 'install.zip') 
# file should be downloaded at this point 
2

もワンラ​​イナーが存在することができます:良いメモリ効率を持っていますが、まだ動作しません

open('install.zip', 'wb').write(urllib.urlopen('http://status.calibre-ebook.com/dist/portable/' + result).read()) 

+0

私たちが何をしているのか分かっていれば、それほど悪くはないと思います。読みやすさとパフォーマンスが常に最良の答えとは限りません。私たちは、読みやすさをあまり損なうことなく、書き込み性を向上させることを試みることができます。 –

+0

- 維持できません。 - 読めない; - 実際にテスト可能ではありません。 - デバッグできません。 - あなたはそれを維持する唯一の者である可能性が高い。 - 「私たち」は数ヶ月または数年であなたを含むことはできません(個人的なものではありません)。あなたがコード化していない数回、そのような1ライナーに衝突する必要があるかもしれませんが、私の推論を理解するために維持する必要があります – sjngm

+0

私は保守性が重要ではないとは言いませんでした。常に「書くことが速い」というのは、「保守可能なコードを書く」よりも重要な部分があります。私の意見では、質問されているアップデータスクリプトは、プログラミング言語理論のすべての単一点を必要としないインスタントプログラムです。これは単なるおもしろいおもちゃのスクリプトなので、プロダクションコードでワンライナーを使用するだけでは十分ではありません。だから私は「彼らはいつも最高の答えではない」と言いました。 –

1

はあなたがどのような問題がある

output = open('install.zip', 'wb') // note the "b" flag which means "binary file" 
+2

説明のないコードは、通常はそれほど役に立ちません。将来の読者のために実際にその情報を追加することを検討してください。 – Sumurai8

関連する問題