Có cách nào để viết một chuỗi trực tiếp vào một con tarfile không? Từ http://docs.python.org/library/tarfile.html có vẻ như chỉ các tệp đã được ghi vào hệ thống tệp mới có thể được thêm vào.python write string trực tiếp tới tarfile
Trả lời
Tôi có thể nói rằng có thể, bằng cách chơi với TarInfo e TarFile.addfile chuyển qua một StringIO dưới dạng tệp tin.
Rất thô, nhưng hoạt động
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()
Như Stefano chỉ ra, bạn có thể sử dụng TarFile.addfile
và 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()
Có thể bạn sẽ muốn để điền vào các lĩnh vực khác của tarinfo
(ví dụ mtime
, uname
vv) cũng.
là "Như Stefano chỉ ra" một chỉnh sửa? Nếu không, tôi không thấy những gì bạn đang làm khác nhau. Cảm ơn phản ứng tất cả như nhau. – gatoatigrado
Tôi nghĩ rằng Stefano đã không có bất kỳ mã đăng tại thời điểm tôi đã viết phản ứng của tôi, ông chỉ lưu ý rằng TarFile.addfile và StringIO có thể được sử dụng. Mặc dù bộ nhớ của tôi hơi mờ. – avakar
FWIW, vâng, @ thông tin chi tiết của Stefano đã được thêm vào [sửa] (http://stackoverflow.com/posts/740839/revisions) sau khi bạn đã viết. Câu trả lời khác nói cùng một điều cũng đến gần như cùng một lúc. – mattdm
Bạn phải sử dụng đối tượng TarInfo và phương pháp addfile thay vì phương thức add thông thường:
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))
Trong trường hợp của tôi, tôi muốn đọc từ một file tar hiện có, thêm một số dữ liệu để các nội dung, và viết nó vào một tập tin mới. Một cái gì đó như:
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)
Cần thêm mã để xử lý các thư mục và liên kết.
Chỉ để lưu nội dung:
Đối tượng StringIO có thuộc tính .len.
Không cần phải tìm kiếm (0) và làm len (foo.buf)
Không cần phải giữ toàn bộ chuỗi xung quanh để làm len() trên, hoặc Thiên Chúa cấm, làm kế toán cho mình.
(Có lẽ nó đã không tại thời điểm OP đã được viết.)
Tôi thấy điều này tìm cách để phục vụ trong Django một vừa tạo trong bộ nhớ lưu trữ .tgz, có thể ai đó sẽ tìm thấy hữu ích mã của tôi:
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. cách viết ostringstream trực tiếp tới cout
- 2. Đầu ra tiến trình tarfile của Python?
- 3. Phát trực tiếp video từ iPhone hoặc Android tới RTMP
- 4. Có liên kết trực tiếp tới bình eclipse.jdt.core không?
- 5. In Java trực tiếp tới máy in mạng Postscript
- 6. C# string [] tới int []
- 7. thêm thư mục trống vào tarfile
- 8. python configparser write to defaults section
- 9. Jackson: có cách nào để tuần tự hóa POJO trực tiếp tới treemodel không?
- 10. 'string' tới [ 's', 'st', 'str', 'STRI', 'strin', 'string']
- 11. Cách phát trực tiếp video trực tiếp RTMP trong Android
- 12. Khuôn khổ tốt cho biểu đồ trực tiếp bằng Python?
- 13. Tạo lại Postgres COPY trực tiếp bằng Python?
- 14. Ngăn chặn một lớp từ instantiation trực tiếp trong Python
- 15. Chuyển trực tiếp phiên bản PyCharm sang Python 3.3?
- 16. Phát trực tiếp nguồn cấp dữ liệu video iPhone trực tiếp iPhone SDK
- 17. Nối tiếp tăng tiếp trực tiếp vào mảng char
- 18. write() ở đầu tệp?
- 19. Tại sao tăng :: định dạng không thể được chuyển đổi trực tiếp thành std :: string?
- 20. Đặt thiết bị Android làm máy chủ để gửi tin nhắn tới GCM trực tiếp
- 21. Thực hiện spambots trực tiếp POST tới máy chủ hoặc điền vào biểu mẫu HTML?
- 22. Làm cách nào để tạo liên kết loại trực tiếp tới URL backgroundImage?
- 23. Phát video trực tiếp tới trình duyệt (có độ trễ thấp)
- 24. Cách in báo cáo tinh thể trực tiếp tới máy khách bằng C# Asp.net
- 25. Làm cách nào để gửi tệp pdf trực tiếp tới máy in bằng JavaScript?
- 26. RTSP để phát trực tiếp RTMP
- 27. FORTRAN WRITE()
- 28. hibernate HQL createQuery() list() gõ vào mô hình trực tiếp
- 29. Đọc truy cập trực tiếp tập tin chưa định dạng trong Python
- 30. Python - Có nên bắt đầu một dự án mới trực tiếp trong Python 3.x không?
Bạn chỉ có thể nói StringIO.StringIO ("hello") để thay thế văn bản và tìm kiếm. – misha
là thủ tục tương tự như đối tượng python3 và byteIO? – proteneer
@proteneer: Tôi tin vào python 3 phương pháp tìm kiếm cung cấp cho bạn một chiều dài nhị phân, trong khi nó sử dụng nội bộ chuỗi '' 'len()' '' hàm, do đó, '' 'tarfile.copyfileobj''' chức năng sẽ thất bại với '' 'nâng cao OSError (" kết thúc của tập tin đạt được ")' '' – luckydonald