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)
これは基本的にここにあるものと同じです。それはうまくいきました。ただし、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
正直なところ、オブジェクトを構築するポイントにtarfile
モジュールにフィードバックしないため、それがどこから来ているのか理解するのに苦労していStringIO
ます。StringIO
と、バイトなどの意味がpython 2から3に少し変更されたことは知ってstr
いますが、間違いはなく、このタスクを解決するためのより良いロジックを思い付くことができません。
StringIO
アーカイブに追加したい文字列の周りにバッファメソッドを提供するために、オブジェクトを正確に作成します。それでも、一部の人str
がそれを提供していないことに私は驚かされます。その上、チェックサムの計算に関与していると思われる行の周りに例外が発生します。
誰かが私が誤解していることを説明できますか、または少なくともstr
ファイルシステムに中間ファイルを作成せずにtarアーカイブに単純なものを追加する方法の例を挙げてください。