所以我正在编写一个脚本来下载文件,如果它没有完成,则从它停止的地方重新开始下载。 这部分已经处理好了。
我把所有这些部分都拿出来,只显示不起作用的部分。 我刚刚编造的亚马逊网址,所以如果你运行这个,它实际上不会下载任何东西,但用实际的下载链接替换网址,将
: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 在打开时占用了大量资源, 因此减慢了另一个过程,有点像时间。
非常感谢您的任何指示。
我不明白为什么每次网络读取都要麻烦地重新打开和关闭文件。 正如 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)