Joppe De Cuyper
Joppe De Cuyper

Reputation: 414

Python, unpacking a .jar file, doesnt work

So, I'm trying to unzip a .jar file using this code: It won't unzip, only 20 / 500 files, and no folders/pictures The same thing happens when I enter a .zip file in filename. Any one any suggestions?

import zipfile
zfilename = "PhotoVieuwer.jar"
if zipfile.is_zipfile(zfilename):
    print "%s is a valid zip file" % zfilename
else:
    print "%s is not a valid zip file" % zfilename
print '-'*40

zfile = zipfile.ZipFile( zfilename, "r" )

zfile.printdir()
print '-'*40

for info in zfile.infolist():
    fname = info.filename

    data = zfile.read(fname)


    if fname.endswith(".txt"):
        print "These are the contents of %s:" % fname
        print data


    filename = fname
    fout = open(filename, "w")
    fout.write(data)
    fout.close()
    print "New file created --> %s" % filename
    print '-'*40

But, it doesn't work, it unzips maybe 10 out of 500 files Can anyone help me on fixing this?

Already Thanks!

I tried adding, what Python told me, I got this: Oops! Your edit couldn't be submitted because:

body is limited to 30000 characters; you entered 153562 and only the error is :

Traceback (most recent call last):
  File "C:\Python27\uc\TeStINGGFDSqAEZ.py", line 26, in <module>
    fout = open(filename, "w")
IOError: [Errno 2] No such file or directory: 'net/minecraft/client/ClientBrandRetriever.class'

The files that get unzipped:

amw.Class
amx.Class
amz.Class
ana.Class
ane.Class
anf.Class
ang.Class
ank.Class
anm.Class
ann.Class
ano.Class
anq.Class
anr.Class
anx.Class
any.Class
anz.Class
aob.Class
aoc.Class
aod.Class
aoe.Class

Upvotes: 2

Views: 8072

Answers (2)

Steven Rumbalski
Steven Rumbalski

Reputation: 45542

This traceback tells you what you need to know:

Traceback (most recent call last):
  File "C:\Python27\uc\TeStINGGFDSqAEZ.py", line 26, in <module>
    fout = open(filename, "w")
IOError: [Errno 2] No such file or directory: 'net/minecraft/client/ClientBrandRetriever.class'

The error message says that either the file ClientBrandRetriever.class doesn't exist or the directory net/minecraft/client does not exist. When a file is opened for writing Python creates it, so it can't be a problem that the file does not exist. It must be the case that the directory does not exist.

Consider that this works

>>> open('temp.txt', 'w') 
<open file 'temp.txt', mode 'w' at 0x015FF0D0>

but this doesn't, giving nearly identical traceback to the one you are getting:

>>> open('bogus/temp.txt', 'w')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'bogus/temp.txt'

Creating the directory fixes it:

>>> os.makedirs('bogus')
>>> open('bogus/temp.txt', 'w')
<open file 'bogus/temp.txt', mode 'w' at 0x01625D30>

Just prior to opening the file you should check if the directory exists and create it if necessary.

So to solve your problem, replace this

fout = open(filename, 'w')

with this

head, tail = os.path.split(filename) # isolate directory name
if not os.path.exists(head):         # see if it exists
    os.makedirs(head)                # if not, create it
fout = open(filename, 'w')

Upvotes: 3

jfs
jfs

Reputation: 414205

If python -mzipfile -e PhotoVieuwer.jar dest works then you could:

import zipfile

with zipfile.ZipFile("PhotoVieuwer.jar") as z:
    z.extractall()

Upvotes: 1

Related Questions