Kịch bản Python để làm phẳng cây trích xuất
Kịch bản được viết dưới đây trích xuất tệp zip và di chuyển các tệp có trong thư mục trên cùng ra khỏi thư mục hiện tại. Kịch bản nhanh này được thiết kế để phù hợp với câu hỏi cụ thể này khi có một thư mục trên cùng duy nhất chứa tất cả các tệp, mặc dù với một vài chỉnh sửa có thể được thực hiện phù hợp cho các trường hợp tổng quát hơn.
#!/usr/bin/env python3
import sys
import os
from zipfile import PyZipFile
for zip_file in sys.argv[1:]:
pzf = PyZipFile(zip_file)
namelist=pzf.namelist()
top_dir = namelist[0]
pzf.extractall(members=namelist[1:])
for item in namelist[1:]:
rename_args = [item,os.path.basename(item)]
print(rename_args)
os.rename(*rename_args)
os.rmdir(top_dir)
Chạy thử nghiệm
Đây là một ví dụ về cách kịch bản được cho là hoạt động. Mọi thứ được trích xuất vào thư mục làm việc hiện tại, nhưng tệp nguồn có thể nằm trong thư mục differet hoàn toàn. Thử nghiệm được thực hiện trên kho lưu trữ zip của kho lưu trữ github cá nhân của tôi.
$ ls
flatten_zip.py* master.zip
$ ./flatten_zip.py master.zip
['utc-time-indicator-master/.gitignore', '.gitignore']
['utc-time-indicator-master/LICENSE', 'LICENSE']
['utc-time-indicator-master/utc-time-indicator', 'utc-time-indicator']
['utc-time-indicator-master/utc_indicator.png', 'utc_indicator.png']
$ ls
flatten_zip.py* LICENSE master.zip utc_indicator.png utc-time-indicator
Kiểm tra với tệp nguồn ở vị trí khác nhau
$ mkdir test_unzip
$ cd test_unzip
$ ../flatten_zip.py ../master.zip
['utc-time-indicator-master/.gitignore', '.gitignore']
['utc-time-indicator-master/LICENSE', 'LICENSE']
['utc-time-indicator-master/utc-time-indicator', 'utc-time-indicator']
['utc-time-indicator-master/utc_indicator.png', 'utc_indicator.png']
$ ls
LICENSE utc_indicator.png utc-time-indicator
unzip archive.zip && mv Release/* .