0

I need to create a zip file from multiple txt files generated from strings.

import zipfile
from io import StringIO

def zip_files(file_arr):
    # file_arr is an array of [(fname, fbuffer), ...]
    f = StringIO()
    z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
    for f in file_arr:
        z.writestr(f[0], f[1])
    z.close()
    return f.getvalue()

file1 = ('f1.txt', 'Question1\nQuestion2\n\nQuestion3')
file2 = ('f2.txt', 'Question4\nQuestion5\n\nQuestion6')
f_arr = [file1, file2]
return zip_files(f_arr)

This throws the error TypeError: string argument expected, got 'bytes' on writestr(). I have tried to use BytesIO instead of string IO, but get the same error. This is based on this answer which is able to do this for python 2.

I can't seem to find anything online about using zipfile for multiple files stored

David Ferris
  • 2,215
  • 6
  • 28
  • 53

1 Answers1

0

Zip files are binary files, so you should use an io.BytesIO stream instead of an io.StringIO one.

blhsing
  • 91,368
  • 6
  • 71
  • 106