Python: извлекать файлы из zip-файла из Интернета без загрузки и сохранения. - PullRequest
0 голосов
/ 19 июня 2020
import re
import requests
import zipfile
import werkzeug
werkzeug.cached_property = werkzeug.utils.cached_property

from robobrowser import RoboBrowser

br = RoboBrowser(history=True)
br.open("loginurl")
forms = br.get_forms()

form=forms[0]

form['username'] = 'myname'
form['password'] = 'mypass'
br.submit_form(form)

url = "ulrlocationofzipfiledownload"
request = br.session.get(url, stream=True)

with open ('data.zip', 'wb') as f:
           f.write(request.content)

На данный момент это работает, и он загружает zip-файл (на мой рабочий стол, где находится сценарий)

Я хочу, чтобы он извлекал определенное c содержимое из zip-файла в конкретное c расположение без создания zip-файла на моем рабочем столе

Я пробовал несколько вариантов этого кода:

with zipfile.ZipFile('files.zip','r') as f:
      myzipfile.extractall('files')

, но не смог заставить его работать.

Это можно получить zip-файл из Интернета и извлечь часть его определенного c содержимого в определенные c места на P C, и все это без предварительного сохранения загруженного zip-файла (возможно, только сохраняя zip-файл «открытым» в ОЗУ? )

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Сделал :)

import requests
import zipfile
import werkzeug
import io
import subprocess

werkzeug.cached_property = werkzeug.utils.cached_property

from robobrowser import RoboBrowser

br = RoboBrowser(history=True)
br.open("loginurlhere")
forms = br.get_forms()

form=forms[0]   #when there are multiple forms in website, which form to select? (0=1st)

form['username'] = 'myusername'
form['password'] = 'mypass'
br.submit_form(form)

url1 = "DirectUrlof1stFileToDownload"

url2 = "DirectUrlof2ndFileToDownload"

# D:\Games\..\...  represent an example of location where to extract the file(s)
response1 = br.session.get(url1, stream=True)
zipfile1 = zipfile.ZipFile(io.BytesIO(response1.content))
zipfile1.extract('nameOftheFileInsideZipToExtract','D:\Games\..\...')

response2 = br.session.get(url2, stream=True)
zipfile2 = zipfile.ZipFile(io.BytesIO(response2.content))
zipfile2.extract('nameOftheFileInsideZipToExtract','D:\Games\..\...')
zipfile2.extract('nameOftheFileInsideZipToExtract','D:\Games\..\...')
zipfile2.extract('nameOftheFileInsideZipToExtract','D:\Games\..\...')


#For executing a specific file (I use it to execute an extracted file)
subprocess.call([r'D:\Games\..\...'])



''' For saving a zip file
request = br.session.get(url1, stream=True)
with open ('data.zip', 'wb') as f:
           f.write(request.content)
'''
0 голосов
/ 19 июня 2020

Вы можете избежать фактического сохранения файла, но используя requests

import requests, zipfile, io

url = 'url-to-zipfile'

response = requests.get(url, stream=True)
zipfile = zipfile.ZipFile(io.BytesIO(response.content))

zipfile.extractall()

Я не уверен, что RoboBrowser может это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...