עבודה עם קבצי zip ב-Python

עבודה עם קבצי zip ב-Python
מאמר זה מסביר כיצד ניתן לבצע פעולות שונות בקובץ zip באמצעות תוכנת פיתון פשוטה. מה זה קובץ zip? ZIP הוא פורמט קובץ ארכיון התומך בדחיסת נתונים ללא אובדן. בדחיסה ללא הפסדים אנו מתכוונים שאלגוריתם הדחיסה מאפשר לשחזר את הנתונים המקוריים בצורה מושלמת מהנתונים הדחוסים. אז קובץ ZIP הוא קובץ בודד המכיל קובץ אחד או יותר דחוס המציע דרך אידיאלית להקטין קבצים גדולים ולשמור קבצים קשורים יחד. למה אנחנו צריכים קבצי zip?
  • כדי להפחית את דרישות האחסון.
  • לשיפור מהירות ההעברה על פני חיבורים סטנדרטיים.
כדי לעבוד על קבצי zip באמצעות python נשתמש במודול python מובנה בשם קובץ zip .

1. חילוץ קובץ zip

Python
   # importing required modules   from   zipfile   import   ZipFile   # specifying the zip file name   file_name   =   'my_python_files.zip'   # opening the zip file in READ mode   with   ZipFile  (  file_name     'r'  )   as   zip  :   # printing all the contents of the zip file   zip  .  printdir  ()   # extracting all the files   print  (  'Extracting all the files now...'  )   zip  .  extractall  ()   print  (  'Done!'  )   
The above program extracts a zip file named 'my_python_files.zip' in the same directory as of this python script. The output of above program may look like this: עבודה עם קבצי zip ב-Pythonהבה ננסה להבין את הקוד לעיל בחלקים:
  • from zipfile import ZipFile 
    ZipFile is a class of zipfile module for reading and writing zip files. Here we import only class ZipFile from zipfile module.
  • with ZipFile(file_name 'r') as zip: 
    Here a ZipFile object is made by calling ZipFile constructor which accepts zip file name and mode parameters. We create a ZipFile object in לִקְרוֹא מצב ושם אותו בשם רוֹכְסָן .
  • zip.printdir() 
    printdir() השיטה מדפיסה תוכן עניינים עבור הארכיון.
  • zip.extractall() 
    extractall() השיטה תחלץ את כל התוכן של קובץ ה-zip לספריית העבודה הנוכחית. אפשר גם להתקשר לְהוֹצִיא() method to extract any file by specifying its path in the zip file. For example:
    zip.extract('python_files/python_wiki.txt') 
    This will extract only the specified file. If you want to read some specific file you can go like this:
    data = zip.read(name_of_file_to_read) 

2. כתיבה לקובץ zip

שקול ספרייה (תיקיה) עם פורמט כזה: עבודה עם קבצי zip ב-Python Here we will need to crawl the whole directory and its sub-directories in order to get a list of all file paths before writing them to a zip file. The following program does this by crawling the directory to be zipped: Python
   # importing required modules   from   zipfile   import   ZipFile   import   os   def   get_all_file_paths  (  directory  ):   # initializing empty file paths list   file_paths   =   []   # crawling through directory and subdirectories   for   root     directories     files   in   os  .  walk  (  directory  ):   for   filename   in   files  :   # join the two strings in order to form the full filepath.   filepath   =   os  .  path  .  join  (  root     filename  )   file_paths  .  append  (  filepath  )   # returning all file paths   return   file_paths   def   main  ():   # path to folder which needs to be zipped   directory   =   './python_files'   # calling function to get all file paths in the directory   file_paths   =   get_all_file_paths  (  directory  )   # printing the list of all files to be zipped   print  (  'Following files will be zipped:'  )   for   file_name   in   file_paths  :   print  (  file_name  )   # writing files to a zipfile   with   ZipFile  (  'my_python_files.zip'    'w'  )   as   zip  :   # writing each file one by one   for   file   in   file_paths  :   zip  .  write  (  file  )   print  (  'All files zipped successfully!'  )   if   __name__   ==   '__main__'  :   main  ()   
The output of above program looks like this: עבודה עם קבצי zip ב-Pythonהבה ננסה להבין את הקוד לעיל על ידי חלוקה לשברים:
  • def get_all_file_paths(directory): file_paths = [] for root directories files in os.walk(directory): for filename in files: filepath = os.path.join(root filename) file_paths.append(filepath) return file_paths 
    First of all to get all file paths in our directory we have created this function which uses the os.walk()  שִׁיטָה. בכל איטרציה כל הקבצים הקיימים באותה ספרייה מצורפים לרשימה שנקראת file_paths . בסופו של דבר נחזיר את כל נתיבי הקבצים.
  • file_paths = get_all_file_paths(directory) 
    Here we pass the directory to be zipped to the get_all_file_paths() פונקציה וקבל רשימה המכילה את כל נתיבי הקבצים.
  • with ZipFile('my_python_files.zip''w') as zip: 
    Here we create a ZipFile object in WRITE mode this time.
  • for file in file_paths: zip.write(file) 
    Here we write all the files to the zip file one by one using לִכתוֹב שִׁיטָה.

3. קבלת כל המידע על קובץ zip

Python
   # importing required modules   from   zipfile   import   ZipFile   import   datetime   # specifying the zip file name   file_name   =   'example.zip'   # opening the zip file in READ mode   with   ZipFile  (  file_name     'r'  )   as   zip  :   for   info   in   zip  .  infolist  ():   print  (  info  .  filename  )   print  (  '  t  Modified:  t  '   +   str  (  datetime  .  datetime  (  *  info  .  date_time  )))   print  (  '  t  System:  tt  '   +   str  (  info  .  create_system  )   +   '(0 = Windows 3 = Unix)'  )   print  (  '  t  ZIP version:  t  '   +   str  (  info  .  create_version  ))   print  (  '  t  Compressed:  t  '   +   str  (  info  .  compress_size  )   +   ' bytes'  )   print  (  '  t  Uncompressed:  t  '   +   str  (  info  .  file_size  )   +   ' bytes'  )   
The output of above program may look like this:
for info in zip.infolist(): 
Here infolist() השיטה יוצרת מופע של ZipInfo class שמכילה את כל המידע על קובץ ה-zip. אנחנו יכולים לגשת לכל המידע כמו תאריך השינוי האחרון של מערכת שמות הקבצים שבה נוצרו קבצים גודל גרסת Zip של קבצים בצורה דחוסה ולא דחוסה וכו'. מאמר זה נתרם על ידי ניכיל קומאר . צור חידון