所以我正在编写一个脚本来下载文件,如果它没有完成,就从它停止的地方重新开始下载。那部分是照顾的。
我拿出所有这些零件,只显示不起作用的零件。亚马逊网址在这里,我刚刚编写,所以如果你运行它,它实际上不会下载任何东西,但用实际的下载链接替换网址,将:
import urllib
import time
import os
file_name = "setup.exe"
web_page = urllib.FancyURLopener().open("https://s3.amazonaws.com/some_bucket/files/"+file_name)
while True:
data = web_page.read(8192)
if not data:
print "done"
break
#print os.getcwd()
with open(file_name, "ab") as outputFile:
outputFile.write(data)
#print "going..."
#time.sleep(1)
会发生什么(这只是在尝试下载EXE文件时),该过程将从web_page读取一个看似随机的次数(1到20之间),然后抛出IOError:13,权限被拒绝。再次,使用.gif或.mov,或者我测试过的其他一些东西,永远不会抛出权限被拒绝的错误。
此外,取消注释time.sleep(1)行可以解决问题。就好像with语句在继续之前没有完全关闭文件。
我认为with语句应该处理结束,不是吗?
我还认为,或许我的当前目录正在被更改,但是从未显示它的未注释(尽管它不一定需要相同的逻辑)。
(还有一点奇怪的是,如果我从桌面运行这个脚本[以便它也写入桌面],Aptana在它前面打开,则不会发生权限被拒绝错误,但第二个我最小化了文本编辑器聚焦桌面,错误被抛出 - 我把它归因于Aptana在打开时占用了大量资源,因此减慢了其他进程并且有点像time.sleep ??)
非常感谢任何指示。
答案 0 :(得分:1)
我不明白为什么你会为每次网络读取重新打开和关闭文件而遇到麻烦。正如Pavel建议的那样,这可能会让病毒扫描程序有机会打开(并锁定?)文件来扫描它。为什么不打开它一次,做你所有的I / O,然后关闭它? (我想它可能与你省略的代码有关。)
而不是:
while True:
data = web_page.read(8192)
if not data:
print "done"
break
with open(file_name, "ab") as outputFile:
outputFile.write(data)
尝试:
with open(file_name, "ab") as outputFile:
while True:
data = web_page.read(8192)
if not data:
print "done"
break
outputFile.write(data)