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.
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:
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"
@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: 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.
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)