Kursus
Prasyarat untuk Bekerja dengan File Zip
- Anda harus memahami penanganan file di Python untuk memahami penanganan file Zip. Jika Anda belum memahami penanganan file, kunjungi bagian File Handling di W3Schools untuk belajar.
- Konsep OOP di Python
- Konsep Python seperti kondisional, loop, fungsi, kelas, dll.
- Jika Anda belum mengetahui Python, ambil kursus gratis DataCamp Intro to Python for Data Science untuk mempelajari bahasa Python atau baca dokumentasi resmi Python.
Buka tautan ini untuk mengunduh semua folder Zip yang saya gunakan di bagian berikutnya.
Apa itu File Zip?
Zip adalah format file arsip yang mendukung kompresi data tanpa kehilangan. File Zip adalah satu berkas yang berisi satu atau lebih file terkompresi.
Kegunaan File Zip?
- File Zip membantu Anda menempatkan semua file terkait di satu tempat.
- File Zip membantu mengurangi ukuran data.
- File Zip ditransfer lebih cepat daripada file individual melalui banyak koneksi.
Modul zipfile
Jelajahi semua method dan kelas dari modul zipfile menggunakan method dir(). Lihat kode untuk mendapatkan semua kelas dan method dari modul zipfile.
import zipfile # importing the 'zipfile' module
print(dir(zipfile))
['BZIP2_VERSION', 'BadZipFile', 'BadZipfile', 'DEFAULT_VERSION', 'LZMACompressor', 'LZMADecompressor', 'LZMA_VERSION', 'LargeZipFile', 'MAX_EXTRACT_VERSION', 'PyZipFile', 'ZIP64_LIMIT', 'ZIP64_VERSION', 'ZIP_BZIP2', 'ZIP_DEFLATED', 'ZIP_FILECOUNT_LIMIT', 'ZIP_LZMA', 'ZIP_MAX_COMMENT', 'ZIP_STORED', 'ZipExtFile', 'ZipFile', 'ZipInfo', '_CD64_CREATE_VERSION', '_CD64_DIRECTORY_RECSIZE', '_CD64_DIRECTORY_SIZE', '_CD64_DISK_NUMBER', '_CD64_DISK_NUMBER_START', '_CD64_EXTRACT_VERSION', '_CD64_NUMBER_ENTRIES_THIS_DISK', '_CD64_NUMBER_ENTRIES_TOTAL', '_CD64_OFFSET_START_CENTDIR', '_CD64_SIGNATURE', '_CD_COMMENT_LENGTH', '_CD_COMPRESSED_SIZE', '_CD_COMPRESS_TYPE', '_CD_CRC', '_CD_CREATE_SYSTEM', '_CD_CREATE_VERSION', '_CD_DATE', '_CD_DISK_NUMBER_START', '_CD_EXTERNAL_FILE_ATTRIBUTES', '_CD_EXTRACT_SYSTEM', '_CD_EXTRACT_VERSION', '_CD_EXTRA_FIELD_LENGTH', '_CD_FILENAME_LENGTH', '_CD_FLAG_BITS', '_CD_INTERNAL_FILE_ATTRIBUTES', '_CD_LOCAL_HEADER_OFFSET', '_CD_SIGNATURE', '_CD_TIME', '_CD_UNCOMPRESSED_SIZE', '_ECD_COMMENT', '_ECD_COMMENT_SIZE', '_ECD_DISK_NUMBER', '_ECD_DISK_START', '_ECD_ENTRIES_THIS_DISK', '_ECD_ENTRIES_TOTAL', '_ECD_LOCATION', '_ECD_OFFSET', '_ECD_SIGNATURE', '_ECD_SIZE', '_EndRecData', '_EndRecData64', '_FH_COMPRESSED_SIZE', '_FH_COMPRESSION_METHOD', '_FH_CRC', '_FH_EXTRACT_SYSTEM', '_FH_EXTRACT_VERSION', '_FH_EXTRA_FIELD_LENGTH', '_FH_FILENAME_LENGTH', '_FH_GENERAL_PURPOSE_FLAG_BITS', '_FH_LAST_MOD_DATE', '_FH_LAST_MOD_TIME', '_FH_SIGNATURE', '_FH_UNCOMPRESSED_SIZE', '_SharedFile', '_Tellable', '_ZipDecrypter', '_ZipWriteFile', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_check_compression', '_check_zipfile', '_get_compressor', '_get_decompressor', 'binascii', 'bz2', 'compressor_names', 'crc32', 'error', 'importlib', 'io', 'is_zipfile', 'lzma', 'main', 'os', 're', 'shutil', 'sizeCentralDir', 'sizeEndCentDir', 'sizeEndCentDir64', 'sizeEndCentDir64Locator', 'sizeFileHeader', 'stat', 'stringCentralDir', 'stringEndArchive', 'stringEndArchive64', 'stringEndArchive64Locator', 'stringFileHeader', 'struct', 'structCentralDir', 'structEndArchive', 'structEndArchive64', 'structEndArchive64Locator', 'structFileHeader', 'sys', 'threading', 'time', 'zlib']
Anda sudah melihat banyak kelas dan method, bukan? Namun, Anda tidak akan mempelajari semuanya. Anda hanya akan mempelajari beberapa kelas dan method untuk bekerja dengan file Zip.
Mari kita lihat beberapa Exception, Kelas, dan Method yang berguna beserta penjelasan singkat.
Exceptions
Exception adalah pesan yang digunakan untuk menampilkan kesalahan secara tepat seperti yang Anda inginkan. Di Python, Anda menggunakan kata kunci try, except, finally untuk penanganan error.
Jika Anda belum familiar dengan penanganan error, buka dokumentasi Error Handling resmi Python untuk mempelajarinya.
Mari kita lihat semua exception dalam modul zipfile.
zipfile.BadZipFile
zipfile.BadZipFile adalah exception dalam modul zipfile. Error ini akan muncul untuk file Zip buruk. Lihat contoh di bawah.
## zipfile.BadZipFile
import zipfile
def main():
try:
with zipfile.ZipFile('sample_file.zip') as file: # opening the zip file using 'zipfile.ZipFile' class
print("Ok")
except zipfile.BadZipFile: # if the zip file has any errors then it prints the error message which you wrote under the 'except' block
print('Error: Zip file is corrupted')
if __name__ == '__main__': main()
## I used a badfile for the test
Ok
zipfile.LargeZipFile
Misalkan Anda ingin bekerja dengan file Zip yang besar, Anda perlu mengaktifkan fungsionalitas ZIP64 saat membuka Zip. Jika tidak diaktifkan, LargeZipFile akan muncul. Lihat contohnya.
## zipfile.LargeZipFile
## Without enabling 'Zip64'
import zipfile
def main():
try:
with zipfile.ZipFile('sample_file.zip') as file:
print('File size is compatible')
except zipfile.LargeZipFile: # it raises an 'LargeZipFile' error because you didn't enable the 'Zip64'
print('Error: File size if too large')
if __name__ == '__main__': main()
File size is compatible
## zipfile.LargeZipFile
## With enabling 'ZIP64'
import zipfile
def main():
try:
with zipfile.ZipFile('sample_file.zip', mode = 'r', allowZip64 = True) as file: # here enabling the 'Zip64'
print('File size is compatible')
except zipfile.LargeZipFile:
print('Error: File size if too large') # if the file size is too large to open it prints the error you have written
if __name__ == '__main__': main()
File size is compatible
Pilih file Zip yang paling cocok untuk penanganan Exception dan coba jalankan programnya. Anda akan mendapatkan gambaran yang jelas.
Kelas
Sederhananya, kelas adalah sekumpulan method dan atribut. Anda menggunakan method dan atribut kelas di mana pun Anda mau dengan membuat instans dari kelas.
Mari kita lihat beberapa kelas dari modul zipfile.
zipfile.ZipFile
Kelas yang paling umum digunakan untuk bekerja dengan File Zip adalah kelas ZipFile.
zipfile.ZipFile digunakan untuk menulis dan membaca file Zip. Kelas ini memiliki beberapa method yang digunakan untuk menangani file Zip.
Sekarang, jelajahi method dari kelas ZipFile menggunakan objek dir(). Lihat kodenya.
import zipfile
print(dir(zipfile.ZipFile)) # accessing the 'ZipFile' class
['_RealGetContents', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_extract_member', '_fpclose', '_open_to_write', '_sanitize_windows_name', '_windows_illegal_name_trans_table', '_write_end_record', '_writecheck', 'close', 'comment', 'extract', 'extractall', 'fp', 'getinfo', 'infolist', 'namelist', 'open', 'printdir', 'read', 'setpassword', 'testzip', 'write', 'writestr']
Anda sudah menggunakan kelas zipfile.ZipFile untuk membaca file Zip pada contoh sebelumnya.
zipfile.ZipFile berisi banyak method seperti extract, open, getinfo, setpassword, dll., untuk bekerja dengan file Zip.
Mari kita lihat beberapa method dari kelas ZipFile.
## zipfile.ZipFile
import zipfile
def main():
with zipfile.ZipFile('sample_file.zip') as file:
# ZipFile.infolist() returns a list containing all the members of an archive file
print(file.infolist())
# ZipFile.namelist() returns a list containing all the members with names of an archive file
print(file.namelist())
# ZipFile.getinfo(path = filepath) returns the information about a member of Zip file.
# It raises a KeyError if it doesn't contain the mentioned file
print(file.getinfo(file.namelist()[-1]))
# ZipFile.open(path = filepath, mode = mode_type, pwd = password) opens the members of an archive file
# 'pwd' is optional -> if it has password mention otherwise leave it
text_file = file.open(name = file.namelist()[-1], mode = 'r')
# 'read()' method of the file prints all the content of the file. You see this method in file handling.
print(text_file.read())
# You must close the file if you don't open a file using 'with' keyword
# 'close()' method is used to close the file
text_file.close()
# ZipFile.extractall(path = filepath, pwd = password) extracts all the files to current directory
file.extractall()
# after executing check the directory to see extracted files
if __name__ == '__main__': main()
[<ZipInfo filename='extra_file.txt' filemode='-rw-rw-rw-' file_size=59>, <ZipInfo filename='READ ME.txt' filemode='-rw-rw-rw-' file_size=59>, <ZipInfo filename='even_odd.py' filemode='-rw-rw-rw-' file_size=129>]
['extra_file.txt', 'READ ME.txt', 'even_odd.py']
<ZipInfo filename='even_odd.py' filemode='-rw-rw-rw-' file_size=129>
b"num = int(input('Enter a Number:- '))\r\nif num % 2 == 0:\r\n\tprint('{} is Even'.fromat(num))\r\nelse:\r\n\tprint('{} is Odd'.fromat(num))"
Jika Anda ingin mempelajari semua method dari kelas ZipFile gunakan fungsi help() pada method yang ingin Anda pelajari.
Atau kunjungi dokumentasi resmi Python untuk belajar.
zipfile.ZipInfo
Kelas zipfile.ZipInfo digunakan untuk merepresentasikan anggota dari folder Zip.
Pertama, jelajahi semua objek dari kelas zipfile.ZipInfo menggunakan method dir(). Lihat kode di bawah.
## zipfile.ZipInfo
import zipfile
print(dir(zipfile.ZipInfo))
['CRC', 'FileHeader', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_decodeExtra', '_encodeFilenameFlags', '_raw_time', 'comment', 'compress_size', 'compress_type', 'create_system', 'create_version', 'date_time', 'external_attr', 'extra', 'extract_version', 'file_size', 'filename', 'flag_bits', 'from_file', 'header_offset', 'internal_attr', 'is_dir', 'orig_filename', 'reserved', 'volume']
Sekarang, Anda akan melihat beberapa method dari kelas zipfile.ZipInfo
## zipfile.ZipInfo
import zipfile
def main():
with zipfile.ZipFile('sample_file.zip') as file:
# 'infolist()' is the object of 'ZipFile' class
# 'infolist()' returns a list containing all the folders and files of the zip -> 'ZipInfo' objects
# assigning last element of the list to a variable to test all the methods of 'ZipInfo'
archive = file.infolist()
read_me_file = archive[-1]
# 'ZipInfo' methods
# ZipInfo_object.filename returns the name of the file
print("Name of the file:- {}".format(read_me_file.filename))
# ZipInfo_object.file_size returns the size of the file
print("Size of the file:- {}".format(read_me_file.file_size))
# ZipInfo_object.is_dir() returns True if it's directory otherwise False
print("Is directory:- {}".format(read_me_file.is_dir()))
# ZipInfo_object.date_time() returns the created date & time of file
print("File created data & time:- {}".format(read_me_file.date_time))
if __name__ == '__main__': main()
Name of the file:- sample_file/READ ME.txt
Size of the file:- 59
Is directory:- False
File created data & time:- (2018, 10, 4, 11, 32, 22)
Kunjungi ZipInfo, jika Anda ingin mempelajari lebih lanjut tentang objek ZipInfo.
Method
Method adalah blok kode untuk fungsionalitas tertentu dalam program. Misalnya, jika Anda ingin mencari nilai absolut dari sebuah angka, Anda dapat menggunakan method Python bernama abs.
Anda dapat menggunakannya di mana pun Anda mau. Mari kita lihat beberapa method dari modul zipfile.
zipfile.is_zipfile()
Method is_zipfile(filename) dari modul zipfile mengembalikan True jika file tersebut adalah Zip yang valid, jika tidak maka akan mengembalikan False.
Mari kita lihat contohnya.
## zipfile.is_zip(filename)
import zipfile
def main():
print(zipfile.is_zipfile('sample_file.zip')) # it returns True
if __name__ == '__main__': main()
True
Menangani File Zip
Di bagian ini, Anda akan belajar cara menangani file Zip seperti Membuka, Mengekstrak, Menulis, dll.
Mengekstrak File Zip
Mengekstrak file dari sebuah Zip menggunakan method extractall ke direktori saat ini.
## extracting zip file
import zipfile
def main():
# assigning filename to a variable
file_name = 'sample_file.zip'
# opening Zip using 'with' keyword in read mode
with zipfile.ZipFile(file_name, 'r') as file:
# printing all the information of archive file contents using 'printdir' method
print(file.printdir())
# extracting the files using 'extracall' method
print('Extracting all files...')
file.extractall()
print('Done!') # check your directory of zip file to see the extracted files
if __name__ == '__main__': main()
File Name Modified Size
sample_file/ 2018-10-04 11:33:22 0
sample_file/even_odd.py 2018-06-29 23:35:54 129
sample_file/READ ME.txt 2018-10-04 11:32:22 59
None
Extracting all files...
Done!
Mengekstrak Zip dengan Kata Sandi
Untuk mengekstrak Zip dengan kata sandi, Anda perlu memberikan nilai ke argumen posisional pwd dari method extract(pwd = password) atau extractall(pwd = password).
Anda harus memberikan kata sandi dalam bentuk bytes. Untuk mengonversi str ke bytes gunakan method bawaan Python bytes dengan format enkode utf-8.
Mari lihat contohnya.
## extracting zip with password
import zipfile
def main():
file_name = 'pswd_file.zip'
pswd = 'datacamp'
with zipfile.ZipFile(file_name) as file:
# password you pass must be in the bytes you converted 'str' into 'bytes'
file.extractall(pwd = bytes(pswd, 'utf-8'))
if __name__ == '__main__': main()
Anda juga dapat mengekstrak file dengan menggunakan method setpassword(pwd = password) dari kelas ZipFile. Lihat contoh di bawah.
## extracting zip with password
import zipfile
def main():
file_name = 'pswd_file.zip'
pswd = 'datacamp'
with zipfile.ZipFile(file_name) as file:
# 'setpassword' method is used to give a password to the 'Zip'
file.setpassword(pwd = bytes(pswd, 'utf-8'))
file.extractall()
if __name__ == '__main__': main()
Membuat File Zip
Untuk membuat file Zip, Anda tidak memerlukan method tambahan. Cukup berikan namanya ke kelas ZipFile, dan arsip akan dibuat di direktori saat ini.
Lihat contoh di bawah.
## Creating Zip file
import zipfile
def main():
archive_name = 'example_file.zip'
# below one line of code will create a 'Zip' in the current working directory
with zipfile.ZipFile(archive_name, 'w') as file:
print("{} is created.".format(archive_name))
if __name__ == '__main__': main()
example_file.zip is created.
Menulis ke File Zip
Anda harus membuka file Zip dalam mode tulis untuk menulis file ke arsip. Mode ini akan menimpa semua file yang sudah ada di Zip.
Mari kita lihat contohnya.
## Writing files to zip
import zipfile
def main():
file_name = 'sample_file.zip'
# Opening the 'Zip' in writing mode
with zipfile.ZipFile(file_name, 'w') as file:
# write mode overrides all the existing files in the 'Zip.'
# you have to create the file which you have to write to the 'Zip.'
file.write('extra_file.txt')
print('File overrides the existing files')
# opening the 'Zip' in reading mode to check
with zipfile.ZipFile(file_name, 'r') as file:
print(file.namelist())
if __name__ == '__main__': main()
File overrides the existing files
['extra_file.txt']
Menambahkan File ke Zip
Anda harus membuka Zip dalam mode append(a) untuk menambahkan file apa pun ke Zip. Mode ini tidak menimpa file yang sudah ada.
Mari kita lihat contohnya.
## Appending files to zip
import zipfile
def main():
file_name = 'sample_file.zip'
# opening the 'Zip' in writing mode
with zipfile.ZipFile(file_name, 'a') as file:
# append mode adds files to the 'Zip'
# you have to create the files which you have to add to the 'Zip'
file.write('READ ME.txt')
file.write('even_odd.py')
print('Files added to the Zip')
# opening the 'Zip' in reading mode to check
with zipfile.ZipFile(file_name, 'r') as file:
print(file.namelist())
if __name__ == '__main__': main()
Files added to the Zip
['extra_file.txt', 'READ ME.txt', 'even_odd.py']
Sampai di sini, Anda telah mempelajari cara menangani file Zip. Sekarang, Anda dapat membuka, menulis, menambahkan, mengekstrak, membuat, dll., file Zip. Berikutnya, Anda akan menulis program sederhana.
Mari kita lihat apa itu?
Mengekstrak Banyak Sub-Zip dengan Kata Sandi Menggunakan Loop dan zipfile
- Anda memiliki sebuah Zip yang berisi beberapa file Zip turunan secara bertingkat. Dan masing-masing file Zip memiliki kata sandi yang merupakan nama mereka. Tantangan kita adalah mengekstrak semua Zip hingga Anda mencapai akhir.
Langkah-langkah Menyelesaikan Masalah
- Ekstrak file Induk menggunakan namanya sebagai kata sandi.
- Dapatkan nama anak pertama menggunakan method namelist(). Simpan dalam variabel.
-
Jalankan loop untuk Waktu Tak Terbatas.
-
Periksa apakah file tersebut Zip atau bukan menggunakan method is_zipfile(). Jika ya, lakukan hal berikut.
-
Buka zip dengan variabel name.
-
Dapatkan kata sandi Zip dari variabel name.
-
Ekstrak Zip.
-
Dapatkan dan simpan nama Zip berikutnya dalam variabel name.
-
-
jika tidak
- Hentikan loop menggunakan break.
-
Saya telah membuat Prosedur di atas. Jika Anda mau, Anda dapat mengubahnya sesuai dengan susunan file Anda.
## Solution
import zipfile
def main():
# storing the parent name
parent_file_name = '000.zip'
with zipfile.ZipFile(parent_file_name, 'r') as parent_file:
# extracting the parent file
pswd = bytes(parent_file_name.split('.')[0], 'utf-8')
parent_file.extractall(pwd = pswd)
# getting the first child
next_zip_name = parent_file.namelist()[0]
# looping through the sub zips infinite times until you don't encouter a 'Zip' file
while True:
if zipfile.is_zipfile(next_zip_name):
# opening the zip
with zipfile.ZipFile(next_zip_name, 'r') as child_file:
# getting password from the zip name
pswd = bytes(next_zip_name.split('.')[0], 'utf-8')
# extracting the zip
child_file.extractall(pwd = pswd)
# getting the child zip name
next_zip_name = child_file.namelist()[0]
else:
break
if __name__ == '__main__': main()
Setelah menjalankan program di atas, Anda akan melihat semua sub-zip diekstrak ke direktori saat ini.
Penutup
Selamat telah menyelesaikan tutorial!
Semoga Anda menikmati tutorial ini. Artikel ini sangat membantu saat Anda bekerja dengan file Zip. Kini Anda dapat bekerja dengan file Zip.
Jika Anda memiliki pertanyaan terkait artikel ini, tanyakan di kolom komentar. Saya akan membalas secepatnya.
Sekali lagi, jika Anda baru mengenal Python ambil kursus gratis DataCamp Intro to Python for Data Science untuk mempelajari bahasa Python atau baca dokumentasi resmi Python.
Selamat ngoding!
