Python: How to unzip a file | Extract Single, multiple or all files from a ZIP archive

W tym artykule omówimy różne sposoby rozpakowania lub wyodrębnienia pojedynczych, wielu lub wszystkich plików z archiwum zip do bieżącego lub innego katalogu.

W module zipfile Pythona, klasa ZipFile dostarcza funkcję członkowską do wyodrębnienia całej zawartości z archiwum ZIP,

ZipFile.extractall(path=None, members=None, pwd=None)

Akceptuje następujące argumenty :

  • path : lokalizacja, gdzie plik zip musi zostać wyodrębniony, jeśli nie jest podany, wyodrębni zawartość w bieżącym katalogu.
  • members : lista plików do wyodrębnienia. Wyodrębni wszystkie pliki w zipie, jeśli ten argument nie jest podany.
  • pwd : Jeśli plik zip jest zaszyfrowany, podaj hasło w tym argumencie, domyślnie jest to Brak.

Wymagany moduł :

from zipfile import ZipFile

Użyjmy tego do wyodrębnienia całej zawartości z plików zip.

Wyodrębnij wszystkie pliki z pliku zip do bieżącego katalogu

Załóżmy, że mamy plik zip 'sample.zip’. w naszym bieżącym katalogu, zobaczmy jak wyodrębnić z niego wszystkie pliki.
Aby go rozpakować najpierw stwórz obiekt ZipFile otwierając plik zip w trybie odczytu, a następnie wywołaj extractall() na tym obiekcie tj.

# Create a ZipFile Object and load sample.zip in itwith ZipFile('sampleDir.zip', 'r') as zipObj: # Extract all the contents of zip file in current directory zipObj.extractall()

Wyodrębni on wszystkie pliki w zip w bieżącym katalogu. Jeśli pliki o tej samej nazwie są już obecne w miejscu ekstrakcji to nadpisze te pliki.

Wyodrębnij wszystkie pliki z pliku zip do innego katalogu

Aby wyodrębnić wszystkie pliki z pliku zip do innego katalogu, możemy przekazać lokalizację docelową jako argument w extractall(). Ścieżka może być względna lub bezwzględna.

# Create a ZipFile Object and load sample.zip in itwith ZipFile('sampleDir.zip', 'r') as zipObj: # Extract all the contents of zip file in different directory zipObj.extractall('temp')

Wyodrębni wszystkie pliki z 'sample.zip’ w folderze temp.

Wyodrębnienie kilku plików z dużego pliku zip na podstawie warunku

Załóżmy, że mamy bardzo duży plik zip i potrzebujemy kilku plików z tysięcy plików w archiwum. Rozpakowanie wszystkich plików z dużego zipa może zająć kilka minut. Ale jeśli jesteśmy zainteresowani tylko kilkoma zarchiwizowanymi plikami, to zamiast rozpakowywać cały plik, możemy wyodrębnić z niego również pojedynczy plik.

W module zipfile Pythona klasa ZipFile udostępnia funkcję członkowską umożliwiającą wyodrębnienie pojedynczego pliku z archiwum ZIP,

ZipFile.extract(member, path=None, pwd=None)

Akceptuje ona następujące argumenty :

  • member : Pełna nazwa pliku do wyodrębnienia. Powinna ona pochodzić z listy nazw zarchiwizowanych plików zwróconych przez ZipFile.namelist()
  • path : lokalizacja, w której plik zip ma zostać wyodrębniony, jeśli nie zostanie podana, plik zostanie wyodrębniony w bieżącym katalogu.
  • pwd : Jeśli plik zip jest zaszyfrowany, podaj hasło w tym argumencie, domyślnie jest to Brak.

Użyjmy tego do wyodrębnienia tylko plików csv z pliku zip i.e.

# Create a ZipFile Object and load sample.zip in itwith ZipFile('sampleDir.zip', 'r') as zipObj: # Get a list of all archived file names from the zip listOfFileNames = zipObj.namelist() # Iterate over the file names for fileName in listOfFileNames: # Check filename endswith csv if fileName.endswith('.csv'): # Extract a single file from zip zipObj.extract(fileName, 'temp_csv')

Wyodrębni tylko pliki csv z danego archiwum zip.

Pełny przykład jest następujący,

from zipfile import ZipFiledef main(): print('Extract all files in ZIP to current directory') # Create a ZipFile Object and load sample.zip in it with ZipFile('sampleDir.zip', 'r') as zipObj: # Extract all the contents of zip file in current directory zipObj.extractall() print('Extract all files in ZIP to different directory') # Create a ZipFile Object and load sample.zip in it with ZipFile('sampleDir.zip', 'r') as zipObj: # Extract all the contents of zip file in different directory zipObj.extractall('temp') print('Extract single file from ZIP') # Create a ZipFile Object and load sample.zip in it with ZipFile('sampleDir.zip', 'r') as zipObj: # Get a list of all archived file names from the zip listOfFileNames = zipObj.namelist() # Iterate over the file names for fileName in listOfFileNames: # Check filename endswith csv if fileName.endswith('.csv'): # Extract a single file from zip zipObj.extract(fileName, 'temp_csv')if __name__ == '__main__': main()

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.