有沒有辦法直接寫一個字符串到tarfile?從http://docs.python.org/library/tarfile.html看來,只有已經寫入文件系統的文件纔可以添加。python直接寫tar到tarfile
29
A
回答
28
我會說這是可能的,通過玩TarInfo e TarFile.addfile傳遞一個StringIO作爲fileobject。
很粗糙,但工程
import tarfile
import StringIO
tar = tarfile.TarFile("test.tar","w")
string = StringIO.StringIO()
string.write("hello")
string.seek(0)
info = tarfile.TarInfo(name="foo")
info.size=len(string.buf)
tar.addfile(tarinfo=info, fileobj=string)
tar.close()
14
由於斯特凡諾指出的那樣,你可以使用TarFile.addfile
和StringIO
。
import tarfile, StringIO
data = 'hello, world!'
tarinfo = tarfile.TarInfo('test.txt')
tarinfo.size = len(data)
tar = tarfile.open('test.tar', 'a')
tar.addfile(tarinfo, StringIO.StringIO(data))
tar.close()
你可能要填寫的tarinfo
(例如mtime
,uname
等)以及其他領域。
2
你必須使用TarInfo對象和addfile方法而不是通常的添加方法:
from StringIO import StringIO
from tarfile import open, TarInfo
s = "Hello World!"
ti = TarInfo("test.txt")
ti.size = len(s)
tf = open("testtar.tar", "w")
tf.addfile(ti, StringIO(s))
2
在我的情況,我想從現有的tar文件閱讀,一些數據添加到內容,並寫入它到一個新的文件。例如:
for ti in tar_in:
buf_in = tar.extractfile(ti)
buf_out = io.BytesIO()
size = buf_out.write(buf_in.read())
size += buf_out.write(other data)
buf_out.seek(0)
ti.size = size
tar_out.addfile(ti, fileobj=buf_out)
處理目錄和鏈接需要額外的代碼。
2
僅供備查:
StringIO對象具有.len屬性。
沒有必要尋求(0)和做len(foo.buf)
沒有必要保持整個字符串做len()on,或上帝禁止,自己做會計。
(也許它沒有在OP寫的時間。)
6
我發現這個尋找如何在Django服務於剛剛在內存中的tgz存檔創建的,可能別人會找到我的代碼有用:
import tarfile
from io import BytesIO
def serve_file(request):
out = BytesIO()
tar = tarfile.open(mode = "w:gz", fileobj = out)
data = 'lala'.encode('utf-8')
file = BytesIO(data)
info = tarfile.TarInfo(name="1.txt")
info.size = len(data)
tar.addfile(tarinfo=info, fileobj=file)
tar.close()
response = HttpResponse(out.getvalue(), content_type='application/tgz')
response['Content-Disposition'] = 'attachment; filename=myfile.tgz'
return response
相關問題
- 1. 將數據直接寫入tar檔案
- 2. 如何將文件追加到tar文件使用python tarfile模塊?
- 3. 如何檢查是否可以使用tarfile模塊寫入tar文件?
- 4. 如何直接將內容寫入tar文件?
- 5. 使用python中的tarfile lib獲取tar文件中的單個文件
- 6. Python tarfile - 檢查tar文件是否存在於外部(即已經被提取)
- 7. 對應於Python`tarfile`模塊中`arcname`選項的tar選項是什麼?
- 8. 用python3中的tarfile模塊從tar中提取文本文件
- 9. Python tarfile比Linux命令慢
- 10. Python TarFile與bz2數據
- 11. 直接寫入到Amazon S3
- 12. 直接寫Serilog到ElasticSearch
- 13. 使用Python的'tarfile',我怎樣才能得到tar檔案中最頂級的目錄?
- 14. 用Python直接寫入加密文件
- 15. 使用python直接寫入實木複合地板到HDFS
- 16. 路易吉寫文件直接到S3
- 17. 寫jpeg文件直接到lmdb
- 18. 直接寫自由日誌到graylog
- 19. 如何直接寫ostringstream到cout
- 20. python:FTP與TarFile
- 21. 防止通過URL直接下載zip,tar文件
- 22. 在Ruby中,如何將tar歸檔流直接提取到文件系統?
- 23. 的Python:直接添加到圖形
- 24. 直接python輸出到linux文件
- 25. Python IF聲明,直接到ELSE
- 26. 從kv lang直接翻譯到Python
- 27. python版本2.4中tarfile模塊的「extractall()」的替代方案Python 2.4版本中不存在tarfile模塊的
- 28. Python的tar文件大小
- 29. 的Python:在tar文件
- 30. 在頁面上直接'寫'
你可以說StringIO.StringIO(「你好」)來代替寫作和尋求。 – misha 2014-03-02 01:13:04
是類似於python3和bytesIO對象的過程嗎? – proteneer 2014-05-18 07:43:15