【问题标题】:How does one add string to tarfile in Python3如何在 Python3 中将字符串添加到 tarfile
【发布时间】:2012-12-08 23:09:30
【问题描述】:

我在 python 中将 str 添加到 tar arhive 时遇到问题。在 python 2 中,我使用了这样的方法:

fname = "archive_name"
params_src = "some arbitrarty string to be added to the archive"

params_sio = io.StringIO(params_src)
archive = tarfile.open(fname+".tgz", "w:gz")
tarinfo = tarfile.TarInfo(name="params")
tarinfo.size = len(params_src)
archive.addfile(tarinfo, params_sio)

它与here 中的内容基本相同。 它运作良好。但是,转到 python 3 时它坏了并导致以下错误:

  File "./translate_report.py", line 67, in <module>
    main()
  File "./translate_report.py", line 48, in main
    archive.addfile(tarinfo, params_sio)
  File "/usr/lib/python3.2/tarfile.py", line 2111, in addfile
    copyfileobj(fileobj, self.fileobj, tarinfo.size)
  File "/usr/lib/python3.2/tarfile.py", line 276, in copyfileobj
    dst.write(buf)
  File "/usr/lib/python3.2/gzip.py", line 317, in write
    self.crc = zlib.crc32(data, self.crc) & 0xffffffff
  TypeError: 'str' does not support the buffer interface

说实话,我很难理解它的来源,因为我没有将任何 strtarfile 模块反馈到我构造 StringIO 对象的位置。 我知道 StringIOstr 的含义,字节等从 python 2 到 3 发生了一些变化,但我没有看到错误并且无法提出更好的逻辑来解决这个任务。

我创建StringIO 对象正是为了提供围绕我要添加到存档的字符串的缓冲区方法。然而令我震惊的是,一些str 没有提供它。最重要的是,围绕似乎负责校验和计算的行引发了异常。

有人可以解释一下我的误解,或者至少举个例子,如何在不在文件系统上创建中间文件的情况下将简单的str 添加到 tar 存档中。

【问题讨论】:

    标签: python-3.x stringio tarfile


    【解决方案1】:

    写入文件时,您需要将 unicode 数据显式编码为字节; StringIO 对象不会为您执行此操作,它是一个 文本 内存文件。改用io.BytesIO() 并编码:

    params_sio = io.BytesIO(params_src.encode('utf8'))
    

    当然可以根据数据调整编码。

    【讨论】:

    • 似乎我一直在绕圈子,但从未找到正确的组合。有用。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 2023-03-17
    • 2017-03-09
    • 1970-01-01
    • 2020-04-15
    相关资源
    最近更新 更多