tarfile Beispiel

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

Hallo,

Könnte mir jemand ein funktionierendes Beispiel mit tarfile geben? Es soll ein paar Dateien verpacken, wobei die Dateien im Archiv andere Namen haben sollten als die Originalen. Bei mir klappt das nicht und ich weiß nicht woran es scheitert:

Code: Alles auswählen

In [47]: cat 1
hello

In [48]: cat 2
dear

In [49]: cat 3
world

In [50]: tar = tarfile.open("sample.tar", "w")

In [51]: tar.addfile(tar.gettarinfo("1","a"))

In [52]: tar.addfile(tar.gettarinfo("2","b"))

In [53]: tar.addfile(tar.gettarinfo("3","c"))

In [54]: tar.close()

In [55]: tar = tarfile.open("sample.tar", "r")

In [56]: tar.extractfile("a").read()
Out[56]: 'b\x00\x00\x00\x00\x00'

In [57]: tar.extractfile("c").read()
Out[57]: '\x00\x00\x00\x00\x00\x00'

In [58]: tar.extractfile("b").read()
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
/home/joe/projects/eclipse_ws/nubisave_clone/nubisave/CloudFusion/test/<ipython-input-58-bc02f820fb98> in <module>()
----> 1 tar.extractfile("b").read()

/usr/lib/python2.7/tarfile.pyc in extractfile(self, member)
   2110 
   2111         if isinstance(member, basestring):
-> 2112             tarinfo = self.getmember(member)
   2113         else:
   2114             tarinfo = member

/usr/lib/python2.7/tarfile.pyc in getmember(self, name)
   1794         tarinfo = self._getmember(name)
   1795         if tarinfo is None:
-> 1796             raise KeyError("filename %r not found" % name)
   1797         return tarinfo
   1798 

KeyError: "filename 'b' not found"

BlackJack

@Boa: Da fehlt das Dateiobjekt welches unter dem Namen gespeichert werden soll. Verwende besser die `add()`-Methode, denn wenn die Dateien auf einem Dateisystem vorliegen und einen Namen haben, dann ist die Variante einfacher, also selber die Dateien öffnen und übergeben zu müssen.
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

@BlackJack:
In der Doku steht doch:
TarFile.gettarinfo(name=None, arcname=None, fileobj=None)
Create a TarInfo object for either the file name or the file object fileobj [...]
Also entweder für die Datei unter "name" oder für das Objekt in "fileobj", oder verstehe ich das falsch?

[EDIT:] Mit add() funktioniert es. Thx.
BlackJack

@Boa: Ja, aber das erste Argument ist tatsächlich nur das Objekt aus dem der Header erzeugt wird wenn man `addfile()` aufruft. Damit wird nur der Header geschrieben, aber nicht die Datei solange man `addfile()` als zweites Argument kein Dateiobjekt übergibt.

`TarFile.addfile()` sieht so aus:

Code: Alles auswählen

    def addfile(self, tarinfo, fileobj=None):
        """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is
           given, tarinfo.size bytes are read from it and added to the archive.
           You can create TarInfo objects using gettarinfo().
           On Windows platforms, `fileobj' should always be opened with mode
           'rb' to avoid irritation about the file size.
        """
        self._check("aw")

        tarinfo = copy.copy(tarinfo)

        buf = tarinfo.tobuf(self.format, self.encoding, self.errors)
        self.fileobj.write(buf)
        self.offset += len(buf)

        # If there's data to follow, append it.
        if fileobj is not None:
            copyfileobj(fileobj, self.fileobj, tarinfo.size)
            blocks, remainder = divmod(tarinfo.size, BLOCKSIZE)
            if remainder > 0:
                self.fileobj.write(NUL * (BLOCKSIZE - remainder))
                blocks += 1

            self.offset += blocks * BLOCKSIZE

        self.members.append(tarinfo)
Antworten