2015-05-18 3 views
0

У меня есть ряд подкаталогов, которые содержат ...tar.gz . Я пытаюсь использовать os.walk(), чтобы просмотреть отдельные файлы и разархивировать их, используя модуль tarfile.Как перебрать каталоги и разархивировать файлы tar.gz?

import os 
import tarfile 

current_wkd = os.getcwd() 

output_dir = '.../Tar_unzip/output' 

for dirpath, dir, files in os.walk(top=current_wkd): 
    #print(files) produces 
    #alpha.tar.gz 
    #beta.tar.gz 
    #...etc 
    for file in files: 
     tar = tarfile.open(file) #this line produces an error:'file cannot be opened' 
     tar.extractall(path=output) 
     tar.close() 

Я пытаюсь перебирать разные каталоги и извлечь ..tar.gz файлы. Я также пытался использовать:

... 
for file in files: 
if file.endswith('.gz'): #find files that end with .gz 
    #some folders contain other files 
    #that may result in an error? 
    tar = tarfile.open(file) 
    tar.extractall(path=output_dir) 

Я действительно заинтересован в, может ли питон использоваться для перемещения каталогов (итерации) и выполнять некоторые функции, такие как разархивации файлов и т.д.

Любая помощь очень ценится. Я новичок в Python. Спасибо.

+0

От редактирования 27 минут назад, похоже, что вы ищете все файлы gzipped, а не только gzipped tarballs ('file.endswith ('. Gz')' вместо оригинала '.tar.gz''). Таким образом, tarfile.open ('spam.gz') 'собирается создать исключение, потому что ungzipped' spam' не является tarball. Вы можете исправить это, используя 'except tarfile.ReadError:', например, log и пропустить не-tar-файлы, но, вероятно, было бы легче искать '.tar.gz' в первую очередь. – abarnert

ответ

1

Как объяснен в os.walk документации:

Note that the names in the lists contain no path components. To get a full path (which begins with top) to a file or directory in dirpath, do os.path.join(dirpath, name) .

И, конечно, вы видели, что именно сам, распечатав alpha.tar.gz и т.д., которые, очевидно, не абсолютные пути или относительные пути доступа из текущего рабочего каталога или что-нибудь иначе вы можете получить доступ, только голые имена файлов.

Также обратите внимание, что каждый пример, приведенный в документах, делает именно то, что рекомендуется. Например:

import os 
for root, dirs, files in os.walk(top, topdown=False): 
    for name in files: 
     os.remove(os.path.join(root, name)) 
    for name in dirs: 
     os.rmdir(os.path.join(root, name)) 

Таким образом, в вашем случае: более

for dirpath, dir, files in os.walk(top=current_wkd): 
    for file in files: 
     tar = tarfile.open(os.path.join(dirpath, file)) 
     tar.extractall(path=output) 
     tar.close() 

одно:

output_dir = '.../Tar_unzip/output' 

Это почти наверняка вызовет ошибку. Во-первых, output и output_dir не совпадают. Для другого, ... ничего не значит; вы, вероятно, хотели ..?

+0

Спасибо! Я ценю объяснение. У меня был os.path.join изначально, я вижу, где я сделал ошибку! – Novice

+0

По-прежнему такая же ошибка: Файл «/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/tarfile.py», строка 1553, открыта повысить ReadError («файл не может быть успешно открыт») tarfile.ReadError: файл не может быть успешно открыт – Novice

+0

@Novice: Это совершенно другая ошибка. Скорее всего, потому, что вы пытаетесь читать файлы '.tar.gz', как если бы они были файлами' .tar'. – abarnert

Смежные вопросы