Herunterladen und entpacken ein .zip-Datei ohne schreiben auf die Festplatte

Habe ich es geschafft, mein erstes python-Skript zu arbeiten, die downloads eine Liste .ZIP-Dateien von einer URL und geht dann zum extrahieren der ZIP-Dateien und schreibt Sie auf Festplatte.

Ich bin jetzt an einem Verlust zu erreichen, ist der nächste Schritt.

Mein primäres Ziel ist es, download und entpacken Sie die zip-Datei und übergeben Sie den Inhalt (CSV-Daten) über einen TCP-stream. Ich würde es vorziehen, nicht, um tatsächlich schreiben Sie die zip-oder extrahierten Dateien auf die Festplatte, wenn ich könnte mit ihm Weg erhalten.

Hier ist mein Aktuelles script, das funktioniert, aber leider hat das schreiben der Dateien auf die Festplatte.

import urllib, urllister
import zipfile
import urllib2
import os
import time
import pickle

# check for extraction directories existence
if not os.path.isdir('downloaded'):
    os.makedirs('downloaded')

if not os.path.isdir('extracted'):
    os.makedirs('extracted')

# open logfile for downloaded data and save to local variable
if os.path.isfile('downloaded.pickle'):
    downloadedLog = pickle.load(open('downloaded.pickle'))
else:
    downloadedLog = {'key':'value'}

# remove entries older than 5 days (to maintain speed)

# path of zip files
zipFileURL = "http://www.thewebserver.com/that/contains/a/directory/of/zip/files"

# retrieve list of URLs from the webservers
usock = urllib.urlopen(zipFileURL)
parser = urllister.URLLister()
parser.feed(usock.read())
usock.close()
parser.close()

# only parse urls
for url in parser.urls: 
    if "PUBLIC_P5MIN" in url:

        # download the file
        downloadURL = zipFileURL + url
        outputFilename = "downloaded/" + url

        # check if file already exists on disk
        if url in downloadedLog or os.path.isfile(outputFilename):
            print "Skipping " + downloadURL
            continue

        print "Downloading ",downloadURL
        response = urllib2.urlopen(downloadURL)
        zippedData = response.read()

        # save data to disk
        print "Saving to ",outputFilename
        output = open(outputFilename,'wb')
        output.write(zippedData)
        output.close()

        # extract the data
        zfobj = zipfile.ZipFile(outputFilename)
        for name in zfobj.namelist():
            uncompressed = zfobj.read(name)

            # save uncompressed data to disk
            outputFilename = "extracted/" + name
            print "Saving extracted file to ",outputFilename
            output = open(outputFilename,'wb')
            output.write(uncompressed)
            output.close()

            # send data via tcp stream

            # file successfully downloaded and extracted store into local log and filesystem log
            downloadedLog[url] = time.time();
            pickle.dump(downloadedLog, open('downloaded.pickle', "wb" ))
  • Warum nicht verwenden Sie temporäre Dateien?
  • ZIP-format ist nicht darauf ausgelegt gestreamt werden. Es nutzt Fußzeilen, das heißt, Sie müssen am Ende der Datei, um herauszufinden, wo die Dinge gehören, ist es innen, was bedeutet, Sie brauchen, um die gesamte Datei, bevor Sie irgendetwas tun können, mit einer Teilmenge davon.
InformationsquelleAutor user714415 | 2011-04-19
Schreibe einen Kommentar