Используя python 2.4 и встроенную библиотеку ZipFile
, я не могу читать очень большие ZIP-файлы (более 1 или 2 ГБ), потому что он хочет хранить все содержимое несжатого файла в памяти. Есть ли другой способ сделать это (либо с помощью сторонней библиотеки, либо с помощью какого-либо другого хака), или я должен «развернуть» и разархивировать его таким образом (что явно не является кросс-платформенным).Как вы разархивируете очень большие файлы в python?
15
A
ответ
16
Вот схема декомпрессии больших файлов.
import zipfile
import zlib
import os
src = open(doc, "rb")
zf = zipfile.ZipFile(src)
for m in zf.infolist():
# Examine the header
print m.filename, m.header_offset, m.compress_size, repr(m.extra), repr(m.comment)
src.seek(m.header_offset)
src.read(30) # Good to use struct to unpack this.
nm= src.read(len(m.filename))
if len(m.extra) > 0: ex= src.read(len(m.extra))
if len(m.comment) > 0: cm= src.read(len(m.comment))
# Build a decompression object
decomp= zlib.decompressobj(-15)
# This can be done with a loop reading blocks
out= open(m.filename, "wb")
result= decomp.decompress(src.read(m.compress_size))
out.write(result)
result = decomp.flush()
out.write(result)
# end of the loop
out.close()
zf.close()
src.close()
8
На Python 2.6, вы можете использовать ZipFile.open()
открыть дескриптор файла на файл, и эффективно копировать содержимое целевого файла по вашему выбору:
import errno
import os
import shutil
import zipfile
TARGETDIR = '/foo/bar/baz'
with open(doc, "rb") as zipsrc:
zfile = zipfile.ZipFile(zipsrc)
for member in zfile.infolist():
target_path = os.path.join(TARGETDIR, member.filename)
if target_path.endswith('/'): # folder entry, create
try:
os.makedirs(target_path)
except (OSError, IOError) as err:
# Windows may complain if the folders already exist
if err.errno != errno.EEXIST:
raise
continue
with open(target_path, 'wb') as outfile, zfile.open(member) as infile:
shutil.copyfileobj(infile, outfile)
Это использует shutil.copyfileobj()
для эффективного чтения данные из открытого объекта zipfile, копируя его в выходной файл.
Смежные вопросы
- 1. Querying очень большие файлы xml
- 2. numpy.savetxt() выводит очень большие файлы
- 3. Журналирование Mongodb - файлы очень большие
- 4. Чтение очень большие файлы .xml.bz2
- 5. Как предварительно сжать очень большие html-файлы
- 6. Python - конвертировать очень большие (6.4GB) XML-файлы в JSON
- 7. Нужно сравнить очень большие файлы около 1,5 ГБ в python
- 8. в Linux: объединить две очень большие файлы
- 9. Сплит очень большие файлы на рекордно границе
- 10. Преобразования XSLT на очень большие файлы
- 11. Как читать очень большие (> 1GB) tar.gz файлы в Node.js?
- 12. Очень большие файлы Jar и FAT32
- 13. Как разбирать очень большие XML-файлы в C#?
- 14. JQuery слайд-шоу изображения очень большие файлы
- 15. html to pdf очень большие файлы php
- 16. Как вы разархивируете пакет с несколькими файлами в отдельные каталоги?
- 17. Как обрабатывать большие файлы в python?
- 18. Как читать очень большие файлы с разделителями табуляции в pandas
- 19. python отправить большие файлы django
- 20. Как вы можете отображать Javascript очень большие цифры?
- 21. Как я могу читать, заменять и писать очень большие файлы?
- 22. Как читать очень большие файлы csv с помощью phpexcel reader
- 23. Очень, очень большие числа в vb.net
- 24. Как заставить Java читать очень большие файлы с помощью сканера?
- 25. как обрабатывать очень большие данные?
- 26. Как хранить очень большие цифры?
- 27. как сортировать очень большие числа
- 28. Конвертировать ОЧЕНЬ большие файлы ppm в JPEG/JPG/PNG?
- 29. Очень большие полотна в JavaFX2
- 30. Очень большие, очень редкие марковские переходные матрицы
Это именно то, что я искал - спасибо! – 2008-12-04 03:55:34