2013-04-07 33 views
9

Có thể tạo một đối tượng TarFile trong bộ nhớ bằng cách sử dụng một bộ đệm chứa dữ liệu tar mà không cần phải viết TarFile vào đĩa và mở nó lại không? Chúng tôi nhận được các byte được gửi qua một ổ cắm.Làm thế nào để xây dựng một đối tượng TarFile trong bộ nhớ từ bộ đệm byte trong Python 3?

Something như thế này:

import tarfile 
byte_array = client.read_bytes() 
tar = tarfile.open(byte_array) # how to do this? 
# use "tar" as a regular TarFile object 
for member in tar.getmembers(): 
    f = tar.extractfile(member) 
    print(f) 

Lưu ý: một trong những lý do để làm điều này là chúng ta cuối cùng muốn có thể làm điều này với nhiều chủ đề cùng một lúc, vì vậy sử dụng một tập tin tạm thời có thể được ghi đè nếu hai chủ đề cố gắng làm điều đó cùng một lúc.

Cảm ơn sự giúp đỡ của bạn!

Trả lời

15

BytesIO() từ IO module thực hiện chính xác những gì bạn cần.

import tarfile, io 
byte_array = client.read_bytes() 
file_like_object = io.BytesIO(byte_array) 
tar = tarfile.open(fileobj=file_like_object) 
# use "tar" as a regular TarFile object 
for member in tar.getmembers(): 
    f = tar.extractfile(member) 
    print(f) 
+1

có thể phải bổ sung chế độ, tùy thuộc vào những gì bạn đang làm (lưu trữ trong một kho lưu trữ) tarfile.open (fileobj = byte_stream, mode = 'r: gz') – Alex

+1

^chính xác. Tôi đã nhận được 'fileobj = file_like_object' và không thực hiện' mode = 'chỉ cho chế độ không phải là python x0 hợp lệ (chúng là tất cả các đối số vị trí, nhưng các tài liệu hiển thị' "tên tệp", "r: gz "' - nếu bạn đang sử dụng công cụ từ bộ nhớ, bạn cần phải 'fileobj = ..., mode = ...' một cách rõ ràng! – sjm324

2

Chắc chắn, một cái gì đó như thế này:

import io 

io_bytes = io.BytesIO(byte_array) 

tar = tarfile.open(fileobj=io_bytes, mode='r') 

(Điều chỉnh mode để phù hợp với định dạng của tập tin tar của bạn, ví dụ như có thể 'mode = 'r: gz', vv)

Các vấn đề liên quan