tarfile.addfile给出错误:TypeError:'str'不支持缓冲区接口

时间:2013-09-18 12:38:17

标签: python python-3.x python-3.3

这是我关于Python的第一篇文章,我对此很陌生。

不幸的是我需要使用Windows作为我的操作系统。 我在python.org上使用python 3.3.2。

我正在尝试从内存创建一个tar文件,向它添加一个FILE.txt。

from io import StringIO
import tarfile

archive_files = []

data = ["DATA1 "]
data.append("DATA2 ")
archive_files.append(("FILE.txt", "\n".join(data)))

tar = tarfile.open ("file.tar", "w:tar")
for name, data in archive_files:
    info = tarfile.TarInfo(name)
    info.size = len(data)
    tar.addfile(info, StringIO(data))
tar.close()

这是错误:

Traceback (most recent call last):
  File "<string>", line 420, in run_nodebug
  File "C:\home\rs94036\src\python\testTar.py", line 14, in <module>
    tar.addfile(info, StringIO(data))
  File "C:\Python33\lib\tarfile.py", line 1957, in addfile
    copyfileobj(fileobj, self.fileobj, tarinfo.size)
  File "C:\Python33\lib\tarfile.py", line 274, in copyfileobj
    dst.write(buf)
TypeError: 'str' does not support the buffer interface

我知道我的问题在第14行,但我无法理解什么是错的。 此代码在Linux中使用,特别是在pacman(ArchLinux包管理器自动化测试)中使用。

有人可以帮助我吗?

谢谢, Renan的

1 个答案:

答案 0 :(得分:1)

您必须将bytes写入tar文件,而不是str,因此在将数据写入tar文件之前必须对数据进行编码。 (您选择的编码,我在示例中使用了utf-8

问题线:

info.size = len(data)
tar.addfile(info, StringIO(data))

应该是这样的:

encoded = data.encode('utf-8')
info.size = len(encoded)
tar.addfile(info, BytesIO(encoded))