代码之家  ›  专栏  ›  技术社区  ›  Renan Biegelmeyer

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

  •  1
  • Renan Biegelmeyer  · 技术社区  · 13 年前

    这是我第一篇关于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包管理器自动化测试)中。

    有人能帮我吗?

    谢谢 瑞南

    1 回复  |  直到 13 年前
        1
  •  2
  •   Viktor Kerkez    13 年前

    你必须写 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))