Python - Download File Using Requests, Directly to Memory

后端 未结 3 405
孤城傲影
孤城傲影 2020-12-03 05:16

The goal is to download a file from the internet, and create from it a file object, or a file like object without ever having it touch the hard drive. This is just for my kn

相关标签:
3条回答
  • 2020-12-03 05:33

    r.raw (HTTPResponse) is already a file-like object (just pass stream=True):

    #!/usr/bin/env python
    import sys
    import requests # $ pip install requests
    from PIL import Image # $ pip install pillow
    
    url = sys.argv[1]
    r = requests.get(url, stream=True)
    r.raw.decode_content = True # Content-Encoding
    im = Image.open(r.raw) #NOTE: it requires pillow 2.8+
    print(im.format, im.mode, im.size)
    

    In general if you have a bytestring; you could wrap it as f = io.BytesIO(r.content), to get a file-like object without touching the disk:

    #!/usr/bin/env python
    import io
    import zipfile
    from contextlib import closing
    import requests # $ pip install requests
    
    r = requests.get("http://www.pythonchallenge.com/pc/def/channel.zip")
    with closing(r), zipfile.ZipFile(io.BytesIO(r.content)) as archive:
        print({member.filename: archive.read(member) for member in archive.infolist()})
    

    You can't pass r.raw to ZipFile() directly because the former is a non-seekable file.

    I would like to see if I can circumvent having to code a file deletion line

    tempfile can delete files automatically f = tempfile.SpooledTemporaryFile(); f.write(u.content). Until .fileno() method is called (if some api requires a real file) or maxsize is reached; the data is kept in memory. Even if the data is written on disk; the file is deleted as soon as it closed.

    0 讨论(0)
  • 2020-12-03 05:41

    This is what I ended up doing.

    import zipfile 
    import requests
    import StringIO
    
    u = requests.get("http://www.pythonchallenge.com/pc/def/channel.zip")
    f = StringIO.StringIO() 
    f.write(u.content)
    
    def extract_zip(input_zip):
        input_zip = zipfile.ZipFile(input_zip)
        return {i: input_zip.read(i) for i in input_zip.namelist()}
    extracted = extract_zip(f)
    
    0 讨论(0)
  • 2020-12-03 05:44

    Your answer is u.content. The content is in the memory. Unless you write it to a file, it won’t be stored on disk.

    0 讨论(0)
提交回复
热议问题