Python 3: извлечь файлы из архива tar.gz - PullRequest
1 голос
/ 17 февраля 2020

Я сейчас работаю с Семантически обогащенной Википедией .

Ресурс находится внутри 7,5 ГБ tar.gz архива и каждый файл в нем, это XML, схема которого:

<text>
       Plain text
</text>

<annotation>
       Annotation for plain text
</annotation>

Текущая задача состоит в том, чтобы извлечь каждый файл, а затем проанализировать содержимое внутри тегов.

Первым делом я использовал модуль tarfile и его метод extractall () , но во время извлечения я получил эту ошибку:

OSError: [Errno 22] Invalid argument: '.\\sew_conservative\\wiki384\\Live_%3F%21*%40_Like_a_Suicide.xml'

в то время как его часть извлекается правильно (я думал, что ошибка была из-за символа unicode внутри имени файла xml, но теперь я вижу, что каждый файл имеет его внутри).

Поэтому я планировал поработать над каждым файлом в архиве, используя некоторые методы API и приведенный ниже код.

К сожалению, объект TarInfo , который упаковывает каждый файл, не не позволяют получить доступ к содержимому файла, а извлечение, файл за файлом, занимает слишком много времени.

def parse_sew():
    sew_path = Path("C:/Users/beppe/Desktop/Tesi/Semantically Enriched Wikipedia/sew_conservative.tar.gz")
    with tarfile.open(sew_path, mode='r') as t:
        for item in t:
           // extraction

Обязательно ли извлечение для анализа и использования содержимого файла XML или возможно читать содержимое архива (на лету, ничего не распаковывая), а затем анализировать содержимое?

ОБНОВЛЕНИЕ: Я извлекаю файлы с помощью tar -xvzf filename.tar.gz команда, все идет хорошо, но через 15 мин s Я смог обработать только 500 МБ из ста ГБ.

1 Ответ

1 голос
/ 17 февраля 2020

Я бы предложил вам использовать 7zip для извлечения. Вы можете начать извлечение 7zip из python, а затем, пока оно извлекается, вы можете читать извлекаемые файлы. Это сэкономит довольно много времени. Вы можете реализовать это с помощью потоков.

Во-вторых, не используйте переднюю косую черту при указании пути windows. Вы можете использовать \\ вместо /.

...