Python寻求像开放的wfile?

时间:2015-06-08 19:32:33

标签: python

请你抽出几次帮助我。如何在wfile中使用seek:

self.wfile = self.connection.makefile('wb', self.wbufsize)

我的代码如下:

self.wfile.seek(offset, 0) self.wfile.write(r.data)

但问题是,每当我尝试运行代码时,我的ILDE都会显示此错误: self.wfile.seek(offset, 0) io.UnsupportedOperation: seek

我认为wfile和open是一样的,但为什么我不能寻求开放?即使这是真的,我仍然认为有办法绕过这个限制..

注意:如果您至少有一次听说过http.server或BaseHTTPServer,您可能会理解wfile是什么。

编辑:我编辑我的帖子来添加我的代码,只是我的完整软件的一部分,但其他部分并不是真的需要:

        self.send_response(200)
        self.end_headers()

        def accelerator(url=None, splitBy=3):


            def buildRange(url, numsplits):
                global globaldownloadersave
                value = int(self.pool.urlopen('HEAD', url).headers["content-length"])
                print("Fullsize: ", value)
                print("Try devide with :", value / numsplits)
                lst = []
                for i in range(numsplits):
                    if i == range(numsplits):
                        lst.append('%s-%s' % (i * value//numsplits + 1, i * value//numsplits + 1 + (value - (i * value//numsplits + 1))))
                    if i == 0:
                        lst.append('%s-%s' % (0, value//numsplits))
                    else:
                        lst.append('%s-%s' % (i * value//numsplits + 1, (i + 1) * value//numsplits))
                return lst
            def downloadChunk(idx, irange):
                global globaldownloadersave
                r = self.pool.urlopen('GET', url, headers={'Range': 'bytes=' + str(irange)})
                offset = int(re.sub("(^.*?)-(.*?)$", "\\1", irange))
                offset2 = int(re.sub("(^.*?)-(.*?)$", "\\2", irange))
                self.wfile.seek(offset, 0)
                self.wfile.write(r.data)

            #self.data = io.BytesIO(b'')
            ranges = buildRange(url, splitBy)
            tasks = []
            # create one downloading thread per chunk
            #q = queue.Queue()  big fail, so comment it
            downloaders = [
                threading.Thread(
                    target=downloadChunk, 
                    args=(idx, irange),
                )
                for idx,irange in enumerate(ranges)
                ]

            # start threads, let run in parallel, wait for all to finish
            for th in downloaders:
                th.start()

            for th in downloaders:
                th.join()

        accelerator(self.url, 4)
        self.close_connection = 1
        return

1 个答案:

答案 0 :(得分:0)

套接字连接是一个流。从流中读取的字节消失了。所以seek毫无意义。虽然可以将所有读取字节保留在内存中并模拟seek,但这通常不是首选。尝试编写代码而无需seek

编辑:乍一看没见。你试图在写作流中寻找。这是永远不可能的,因为你不能说接收端“忘记我发送的所有内容,你得到新的数据”。如果您确实需要该功能,则必须将数据本地保存在普通文件中,完成后,将此文件作为一个块发送给客户端。