Example of how to use PyLZMA
Asked Answered
F

2

13

I want to use PyLZMA to extract a file from an archive (e.g. test.7z) and extract it to the same directory.

I'm a newbie to Python and have no idea how to start. I've done some googling and found some examples and docs, but I don't understand how they work.

Could someone please post the basic code for what I want to do so that I can start to work and understand?

Fleischer answered 22/5, 2012 at 11:53 Comment(5)
Could you show some examples of what you have tried and how it failed?Lodmilla
It seems this library is indeed completely undocumented, except some docstrings of the kind class Base(object): """base oject"""...Marino
People here usually frown upon "give me the code" questions, try to show some effort, show us what you found, tried and what you're missing and you'll get better support.Isobath
What I found: github.com/fancycode/pylzma/blob/master/doc/usage.txt the examples here: nullege.com/codes/search/pylzma.decompress i tried f = Archive7z(open('test.7z', 'rb')) f.list() which displays the archive's content but I dont't know how to tell python to extract it. (I'll keep searching for a solution on my own)Fleischer
When you have no idea where to start, I recommend you downloading the package sources and check if there is a "test' directory. It is often simple code that will help you :)Gravestone
F
15

Here is a Python class to handle the basic functionality. I have used it for my own work:

import py7zlib
class SevenZFile(object):
    @classmethod
    def is_7zfile(cls, filepath):
        '''
        Class method: determine if file path points to a valid 7z archive.
        '''
        is7z = False
        fp = None
        try:
            fp = open(filepath, 'rb')
            archive = py7zlib.Archive7z(fp)
            n = len(archive.getnames())
            is7z = True
        finally:
            if fp:
                fp.close()
        return is7z

    def __init__(self, filepath):
        fp = open(filepath, 'rb')
        self.archive = py7zlib.Archive7z(fp)

    def extractall(self, path):
        for name in self.archive.getnames():
            outfilename = os.path.join(path, name)
            outdir = os.path.dirname(outfilename)
            if not os.path.exists(outdir):
                os.makedirs(outdir)
            outfile = open(outfilename, 'wb')
            outfile.write(self.archive.getmember(name).read())
            outfile.close()
Floppy answered 6/9, 2012 at 3:32 Comment(1)
Warning: Currently Archive7z will uncompress the entire contents into memory to read the files... so in my case a 10 MB file became 1.2 GB in memory.Calends
O
3

Here are two code snippets i found here http://www.linuxplanet.org/blogs/?cat=3845

# Compress the input file (as a stream) to a file (as a stream)
i = open(source_file, 'rb')
o = open(compressed_file, 'wb')
i.seek(0)
s = pylzma.compressfile(i)
while True:
    tmp = s.read(1)
    if not tmp: break
    o.write(tmp)
o.close()
i.close()

# Decomrpess the file (as a stream) to a file (as a stream)
i = open(compressed_file, 'rb')
o = open(decompressed_file, 'wb')
s = pylzma.decompressobj()
while True:
    tmp = i.read(1)
    if not tmp: break
    o.write(s.decompress(tmp))
o.close()
i.close()
Omnibus answered 31/5, 2012 at 23:1 Comment(4)
Similar snippets are already in github.com/fancycode/pylzma/blob/master/doc/usage.txt ; also, s.flush() should be noted for the decompression case. (yet, somehow, googling leads here first, heh)Paulownia
Since the OP wants to extract a file from an archive, I don't think this answers the question and find it astonishing that it was up-voted at all.Lath
usage.txt --> usage.md @ github.com/fancycode/pylzma/blob/master/doc/USAGE.mdMetonymy
linuxplanet.org is an ex-parrotSeeger

© 2022 - 2024 — McMap. All rights reserved.