Python を使用してリモート zip アーカイブから、ファイル名に一致する選択したファイルを読み取る必要があります。完全な zip を一時ファイルに保存したくありません (それほど大きくないので、メモリ内のすべてを処理できます)。
私はすでにコードを書いており、それは機能します。後で検索できるように、自分でこれに答えています。しかし、私が Stackoverflow の愚かな参加者の 1 人であることを示す証拠があるので、改善の余地があると確信しています。
これが私がやった方法です(「.ranks」で終わるすべてのファイルを取得します):
import urllib2, cStringIO, zipfile
try:
remotezip = urllib2.urlopen(url)
zipinmemory = cStringIO.StringIO(remotezip.read())
zip = zipfile.ZipFile(zipinmemory)
for fn in zip.namelist():
if fn.endswith(".ranks"):
ranks_data = zip.read(fn)
for line in ranks_data.split("\n"):
# do something with each line
except urllib2.HTTPError:
# handle exception
質問と回答をくれた Marcel に感謝します (別のコンテキストで同じ問題が発生し、ファイルのようなオブジェクトが実際にはファイルのようなものではないという同じ問題に遭遇しました)。更新情報: Python 3.0 の場合、コードを少し変更する必要があります。
import urllib.request, io, zipfile
try:
remotezip = urllib.request.urlopen(url)
zipinmemory = io.BytesIO(remotezip.read())
zip = zipfile.ZipFile(zipinmemory)
for fn in zip.namelist():
if fn.endswith(".ranks"):
ranks_data = zip.read(fn)
for line in ranks_data.split("\n"):
# do something with each line
except urllib.request.HTTPError:
# handle exception
これにより、zip ファイル全体をダウンロードしなくても作業が完了します。
ZIP ファイルを単に解凍すると、セキュリティ上の脆弱性が生じる可能性があることに注意してください。