반응형
URL에서 .ZIP 파일 목록을 다운로드 한 다음 ZIP 파일을 추출하여 디스크에 쓰는 첫 번째 Python 스크립트가 작동하도록 관리했습니다.
나는 이제 다음 단계를 달성하기 위해 헤매고 있습니다.
내 주요 목표는 zip 파일을 다운로드 및 추출하고 TCP 스트림을 통해 콘텐츠 (CSV 데이터)를 전달하는 것입니다. zip 파일이나 압축을 푼 파일을 디스크에 실제로 쓰지 않는 것이 좋습니다.
다음은 작동하지만 불행히도 파일을 디스크에 써야하는 현재 스크립트입니다.
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" ))
해결 방법
# get_zip_data() gets a zip archive containing 'foo.txt', reading 'hey, foo'
from StringIO import StringIO
zipdata = StringIO()
zipdata.write(get_zip_data())
myzipfile = zipfile.ZipFile(zipdata)
foofile = myzipfile.open('foo.txt')
print foofile.read()
# output: "hey, foo"
또는 더 간단히 (Vishal에게 사과) :
myzipfile = zipfile.ZipFile(StringIO(get_zip_data()))
for name in myzipfile.namelist():
[ ... ]
Python 3에서는 StringIO 대신 BytesIO를 사용합니다.
filebytes = io.BytesIO(get_zip_data())
myzipfile = zipfile.ZipFile(filebytes)
for name in myzipfile.namelist():
[ ... ]
참조 페이지 https://stackoverflow.com/questions/5710867
반응형
'파이썬' 카테고리의 다른 글
파이썬 튜플에 대한 zip 함수 도움말 (0) | 2020.10.05 |
---|---|
파이썬 Python dict를 kwargs로 변환 하시겠습니까? (0) | 2020.10.05 |
파이썬 Python으로 Linux에서 키 입력 시뮬레이션 (0) | 2020.10.05 |
파이썬 pdfminer를 라이브러리로 사용하는 방법 (0) | 2020.10.05 |
파이썬에서 파일을 반복하는 방법 (0) | 2020.10.04 |
댓글