2012-12-21 28 views
4

我在添加str到python中的tar文件時遇到問題。在python 2中,我使用了這樣的方法:如何在Python3中將字符串添加到tarfile中

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中可以找到的相同。 它運作良好。然而,將蟒蛇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沒有提供它。最重要的是,似乎要對校驗和計算負責的線路引發了異常。

有人可以解釋我小姐的理解,或者至少舉一個例子,說明如何在tar文件中添加一個簡單的str,而不需要在文件系統上創建一箇中間文件。

回答

4

寫入文件時,需要明確地將Unicode數據編碼爲字節; StringIO對象不爲你做這個,它是一個文本內存文件。使用io.BytesIO(),而不是和編碼:

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

調整你的編碼數據,當然。

+0

看來,我一直在圍繞好灌木叢跳動,但從來沒有得到正確的組合。有用。謝謝。 – luk32

相關問題