[python] Upload velkeho souboru

slush slush na centrum.cz
Úterý Září 28 16:00:39 CEST 2010


Zdravim,

resim uz pekelne dlouho problem, jak z Pythonu uploadovat velky soubor pres
PUT/POST - pokud mozno nejakym standardnim zpusobem.

Problem jsem zatim vyresil pomoci mmap. Nelibi se mi ale, ze na 32bit
systemech je maximalni velikost uploadovaneho souboru ~4GB. Zaroven jsem ale
neprisel na to, jak donutit urllib2, aby s daty pracovala jako se streamem
(file-like objektem) a ne jako se stringem. Posledni napad je napsat si
'string-like object', ktery bude doopravdy soubor a nemapovat cely jeho
obsah na pamet (jako dela mmap), ale seekovat a nejak to cist do bufferu.
Prijde mi ale dost divne, ze by neexistovalo jednodussi reseni.

Soucasna implementace je nasledujici:

 from urllib2 import Request, urlopen

   @classmethod
    def _f2b(cls, f, size=None):
       '''
            Map files into memory and act as buffer.
       '''
        if isinstance(f, basestring):
           # No conversion needed
            return f
       elif getattr(f, 'fileno', None):
            # Map to memory
           if size == None:
                # When size is already known, skip this
               f.seek(0, os.SEEK_END)
                size = f.tell()
               f.seek(0)
            return mmap.mmap(f.fileno(), size)
       else:
            raise fs.errors.UnsupportedError("Cannot handle type %s" %
type(f))

@classmethod
    def put(cls, path, data, size=None):
        class PutRequest(Request):
            def __init__(self, *args, **kwargs):
                self.get_method = lambda: 'PUT'
                Request.__init__(self, *args, **kwargs)

        data = cls._f2b(data, size=size)
        req = PutRequest(''.join([cls.webapi, path]), data,
headers=cls.headers)
        return urlopen(req)


Diky za kazdou radu.

Marek
------------- dal?í ?ást ---------------
HTML p?íloha byla odstran?na...
URL: <http://www.py.cz/pipermail/python/attachments/20100928/a7da46f4/attachment.html>


Další informace o konferenci Python