jh314
jh314

Reputation: 27802

Zipping only files in Python

So I create several files in some temp directory dictated by NamedTemporaryFile function.

zf = zipfile.ZipFile( zipPath, mode='w' )
for file in files:
    with NamedTemporaryFile(mode='w+b', bufsize=-1, prefix='tmp') as tempFile:
       tempPath = tempFile.name
    with open(tempPath, 'w') as f:
       write stuff to tempPath with contents of the variable 'file'
    zf.write(tempPath)

zf.close()

When I use the path of these files to add to a zip file, the temp directories themselves get zipped up.
When I try to unzip, I get a series of temp folders, which eventually contain the files I want.
(i.e. I get the folder Users, which contains my user_id folder, which contains AppData...).

Is there a way to add the files directly, without the folders, so that when I unzip, I get the files directly? Thank you so much!

Upvotes: 0

Views: 432

Answers (2)

zenpoy
zenpoy

Reputation: 20126

Try giving the arcname:

from os import path

zf = zipfile.ZipFile( zipPath, mode='w' )
for file in files:
    with NamedTemporaryFile(mode='w+b', bufsize=-1, prefix='tmp') as tempFile:
       tempPath = tempFile.name
    with open(tempPath, 'w') as f:
       write stuff to tempPath with contents of the variable 'file'
    zf.write(tempPath,arcname=path.basename(tempPath))

zf.close()

Using os.path.basename you can get the file's name from a path. According to zipfile documentation, the default value for arcname is filename without a drive letter and with leading path separators removed.

Upvotes: 2

mrb
mrb

Reputation: 3330

Try using the arcname parameter to zf.write:

zf.write(tempPath, arcname='Users/mrb0/Documents/things.txt')

Without knowing more about your program, you may find it easier to get your arcname from the file variable in your outermost loop rather than deriving a new name from tempPath.

Upvotes: 1

Related Questions