1

所以我正在编写一个脚本来下载一个文件,如果它没有完成,则从它停止的地方重新开始下载。那部分已经处理好了。

我把所有这些部分都拿出来只显示不起作用的部分。我刚刚制作的亚马逊网址,所以如果你运行它,它实际上不会下载任何东西,但是用实际的下载链接替换网址,会:

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, Permission denied。同样,使用 .gif 或 .mov 或我测试过的其他一些东西,永远不会抛出权限被拒绝错误。

此外,取消注释 time.sleep(1) 行可以解决问题。就好像 with 语句在继续之前没有完全关闭文件。

我认为 with 语句应该处理关闭,不是吗?

我还认为,也许我当前的目录正在以某种方式被更改,但取消注释永远不会显示它(尽管按照相同的逻辑,它不一定必须这样做)。

(还有什么奇怪的是,如果我从桌面运行这个脚本[以便它也写入桌面]并在它前面打开 Aptana,权限被拒绝错误不会发生,但第二次我将文本编辑器最小化为聚焦桌面,抛出错误——我将此归因于 Aptana 在打开时占用了大量资源,因此减慢了其他进程并且有点像 time.sleep??)

非常感谢您的任何指点。

4

1 回答 1

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)
于 2013-01-24T18:48:12.313 回答