كيف أقرأ الملفات المحددة من أرشيف Zip بعيد عبر HTTP باستخدام Python؟

StackOverflow https://stackoverflow.com/questions/94490

  •  01-07-2019
  •  | 
  •  

سؤال

أحتاج إلى قراءة الملفات المحددة، المطابقة لاسم الملف، من أرشيف مضغوط عن بعد باستخدام Python.لا أريد حفظ الملف المضغوط بالكامل في ملف مؤقت (إنه ليس بهذا الحجم، لذا يمكنني التعامل مع كل شيء في الذاكرة).

لقد كتبت الكود بالفعل وهو يعمل، وأنا أجيب على هذا بنفسي حتى أتمكن من البحث عنه لاحقًا.ولكن بما أن الأدلة تشير إلى أنني أحد المشاركين الأغبى في Stackoverflow، فأنا متأكد من أن هناك مجالًا للتحسين.

هل كانت مفيدة؟

المحلول

وإليك كيف فعلت ذلك (الاستيلاء على جميع الملفات التي تنتهي بـ ".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

نصائح أخرى

شكرًا مارسيل على سؤالك وإجابتك (واجهت نفس المشكلة في سياق مختلف وواجهت نفس الصعوبة مع الكائنات الشبيهة بالملفات التي لا تشبه الملفات حقًا)!فقط كتحديث:بالنسبة لـ 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

سيؤدي هذا إلى تنفيذ المهمة دون تنزيل الملف المضغوط بأكمله!

http://pypi.python.org/pypi/pyremotezip

ضع في اعتبارك أن مجرد فك ضغط ملف ZIP قد يؤدي إلى حدوث ذلك ثغرة أمنية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top