2013-12-07 2 views
0

У меня есть массивный архив с 13000 файлами. Как извлечь только самый большой файл внутри этого из программы Python?Найти большой файл внутри tarball

Я пробовал читать через архив и проверять длину каждого извлеченного файла, но это слишком долго. Есть ли более оптимизированный способ сделать это?

Оригинальный код (Дополнено для полноты этого вопроса, хотя ответ был выбран):

from tarfile import TarFile 
archive = TarFile(filename) 
members = archive.getmembers() 
sizes = [] 
for member in members: 
    sizes.append(member.size) 
largest = max(sizes) 
largest_info = sizes.index(largest) 
print(largest_info.name) 
+0

Как вы ожидаете найти самый большой файл, не глядя на все файлы в tarball? –

ответ

3

Вы смотрели в the documentation?

import tarfile 
archive = tarfile.TarFile('/path/to/my/tarfile.tar') 
max_size = 0 
max_name = None 
for file in archive.getmembers(): 
    if file.size > max_size: 
     max_size = file.size 
     max_name = file.name 

print(max_size) 
print(max_name) 
+0

не будет лучше встроенная функция 'max'? 'max (archive.getmembers(), key = operator.itemgetter ('size'))' – mgilson

+0

Я получаю 'TypeError: объект TarInfo 'не подлежит расшифровке', когда я запускаю его. –

+2

'max (archive.getmembers(), key = operator.attrgetter ('size'))', похоже, работает нормально. – Alphadelta14

2

Ответ: вам нужно просмотреть весь архив, чтобы узнать самый большой член. Это потому, что TAR файл был разработан для архивирования типа, и, следовательно, не имеет оглавления (TOC):

The possible reason for not using a centralized location of information is that tar was originally meant for tapes, which are bad at random access anyway: if the Table Of Contents (TOC) were at the start of the archive, creating it would mean to first calculate all the positions of all files, which needs doubled work, a big cache, or rewinding the tape after writing everything to write the TOC

Симеон Виссер предоставил вам рабочий код.

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