2015-06-17 23 views
10

Tôi đang cố tạo một kịch bản để giải nén tất cả các tệp .tar.gz từ các thư mục trong một thư mục. Ví dụ, tôi sẽ có một tập tin mà nó gọi (testing.tar.gz). Sau đó, nếu tôi làm theo cách thủ công, tôi có thể nhấn để "trích xuất ở đây", sau đó tệp .tar.gz sẽ tạo một tệp mới và nó gọi testing.tar. Cuối cùng, nếu tôi lặp lại quá trình nhấn "trích xuất ở đây", tệp .tar sẽ gửi cho tôi tất cả các tệp .pdf.Tôi muốn tạo một tập lệnh để giải nén tập tin (.tar.gz) qua (Python)

Tôi tự hỏi làm thế nào tôi có thể làm điều đó, và tôi có mã của tôi ở đây và nó có vẻ không thực sự làm việc tho.

import os 
import tarfile 
import zipfile 

def extract_file(path, to_directory='.'): 
    if path.endswith('.zip'): 
     opener, mode = zipfile.ZipFile, 'r' 
    elif path.endswith('.tar.gz') or path.endswith('.tgz'): 
     opener, mode = tarfile.open, 'r:gz' 
    elif path.endswith('.tar.bz2') or path.endswith('.tbz'): 
     opener, mode = tarfile.open, 'r:bz2' 
    else: 
     raise ValueError, "Could not extract `%s` as no appropriate extractor is found" % path 

    cwd = os.getcwd() 
    os.chdir(to_directory) 

    try: 
     file = opener(path, mode) 
     try: file.extractall() 
     finally: file.close() 
    finally: 
     os.chdir(cwd) 
+1

Trừ khi có điểm bằng cách sử dụng Python, nó giống như một công việc phù hợp nhất cho tập lệnh shell. – mfaerevaag

+1

extractall lấy thư mục đích làm tham số, không cần phải chdir qua lại –

Trả lời

24

Tại sao bạn muốn "nhấn" hai lần để trích xuất .tar.gz, khi nào bạn có thể dễ dàng thực hiện việc này một lần? Dưới đây là một mã đơn giản để trích xuất cả hai .tar và .tar.gz trong một lần:

import tarfile 
mode = "r:gz" if (fname.endswith("tar.gz")) else "r:" 
tar = tarfile.open(fname, mode) 
tar.extractall() 
tar.close() 
+0

Đó là vì, giống như tệp tôi có là (.tar.gz). Nhưng quá trình giải nén, nó phải được trích xuất từ ​​(.tar.gz) sang (.gz) sau đó, trích xuất một lần nữa sẽ cung cấp thông tin tôi cần như tệp .pdf, v.v. – Alex

+0

và mã của bạn không hoạt động: if (fname.endswith ("tar.gz")): TênError: name 'fname' không được xác định – Alex

+2

@Alex 'fname' sẽ là một chuỗi là tên tệp của bạn. –

Các vấn đề liên quan