4

strPythonで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アーカイブに単純なものを追加する方法の例を挙げてください。

4

1 に答える 1

4

ファイルに書き込むときは、Unicodeデータを明示的にバイトにエンコードする必要があります。StringIOオブジェクトはあなたのためにこれをしません、それはテキストメモリファイルです。代わりに使用io.BytesIO()してエンコードします。

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

もちろん、エンコーディングをデータに合わせて調整してください。

于 2012-12-21T11:10:12.023 に答える