Saya telah membuat file .tar pada mesin Linux sebagai berikut:

tar cvf test.tar test_folder/

Di mana test_folder berisi beberapa file seperti yang ditunjukkan di bawah ini:

test_folder 
|___ file1.jpg
|___ file2.jpg
|___ ...

Saya tidak dapat mengekstrak file individual secara terprogram dalam arsip tar menggunakan Python. Lebih khusus lagi, saya telah mencoba yang berikut ini:

import tarfile
with tarfile.open('test.tar', 'r:') as tar:
    img_file = tar.extractfile('test_folder/file1.jpg')
    # img_file contains the object: <ExFileObject name='test_folder/test.tar'>

Di sini, img_file tampaknya tidak berisi gambar yang diminta, melainkan berisi file sumber .tar. Saya tidak yakin, di mana saya mengacaukan segalanya. Setiap saran akan sangat membantu. Terima kasih sebelumnya.

3
Swaroop 11 Desember 2020, 03:01

3 jawaban

Jawaban Terbaik

Menambahkan 2 baris ke kode Anda akan menyelesaikan masalah Anda:

import tarfile

with tarfile.open('test.tar', 'r:') as tar:
    img_file = tar.extractfile('test_folder/file1.jpg')
    
    # --------------------- Add this ---------------------------
    with open ("img_file.jpg", "wb") as outfile:
        outfile.write(img_file.read())

Penjelasannya:

Metode .extractfile() hanya memberi Anda konten dari file yang diekstrak (yaitu data).

Itu tidak mengekstrak file apa pun ke sistem file.

Jadi Anda telah melakukannya sendiri - dengan membaca konten yang dikembalikan ini (img_file.read()) dan menuliskannya ke dalam file pilihan Anda (outfile.write(...)).


Atau — untuk menyederhanakan hidup Anda — gunakan metode .extract() sebagai gantinya. Lihat jawaban saya yang lain.

2
MarianD 11 Desember 2020, 02:17

Anda mungkin ingin menggunakan metode .extract() daripada metode .extractfile() (lihat jawaban lain saya ):

import tarfile

with tarfile.open('test.tar', 'r:') as tar:
    tar.extract('test_folder/file1.jpg')         # .extract()  instead of .extractfile()

Catatan:

  1. File yang Anda ekstrak akan berada di folder (mungkin baru dibuat) test_folder di bawah direktori Anda saat ini.

  2. Metode .extract() mengembalikan None, jadi tidak perlu menetapkannya (img_file = tar.extract(...))

4
MarianD 11 Desember 2020, 01:53

Ini karena extractfile() mengembalikan objek io.BufferReader, jadi pada dasarnya Anda mengekstrak file di direktori Anda dan menyimpan io.BufferReader di variabel Anda.

Yang dapat Anda lakukan adalah, ekstrak file lalu buka file di pengelola konten yang berbeda different

import tarfile
with tarfile.open('test.tar', 'r:') as tar:
    tar.extractfile('test_folder/file1.jpg')

with open('test_folder/file1.jpg','rb') as img:
    # do something with img. Here img is your img file
-1
Charming-Deamon 11 Desember 2020, 00:31