如何在 Python3 中将字符串添加到 tarfile

2024-04-24

我在添加时遇到问题str到 python 中的 tar 存档。在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 https://stackoverflow.com/questions/740820/python-write-string-directly-to-tarfile。 效果很好。但是,转到 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

老实说,我很难理解它来自哪里,因为我不喂任何东西str to tarfile模块回到我构建的点StringIO目的。 我知道的含义StringIO and str、 bytes 等从 python 2 到 3 发生了一些变化,但我没有看到错误,也无法提出更好的逻辑来解决这个任务。

我创造StringIO对象精确地为我想要添加到存档中的字符串提供缓冲区方法。但令我震惊的是,有些人str不提供它。最重要的是,在似乎负责校验和计算的行周围引发了异常。

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


写入文件时,需要显式地将 unicode 数据编码为字节;StringIO对象不会为你做这件事,它是一个text内存文件。使用io.BytesIO()相反并编码:

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

当然,根据您的数据调整编码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Python3 中将字符串添加到 tarfile 的相关文章

随机推荐