Python: получить один файл в TAR с FTP
У меня есть ftp-сервер, который содержит все мои tar-файлы, эти tar-файлы имеют размер более 500 МБ +, и их слишком много, и все, что мне нужно было сделать, это получить один файл из TAR, который содержит несколько файлов, который становится 500 МБ +.
Моя первоначальная идея - загрузить все tar-файлы и получить один нужный мне файл, но это кажется неэффективным.
Я использую Python в качестве языка программирования.
1 ответ
Этот ответ не специфичен для python, потому что проблема не специфична для python: теоретически вы можете прочитать ту часть Tar-файла, где находятся ваши данные. С FTP (а также с pythons ftplib) это возможно, выполнив сначала команду REST, чтобы указать начальную позицию в файле, затем RETR, чтобы начать загрузку данных, и после того, как вы получите необходимый объем данных, вы можете закрыть подключение для передачи данных.
Но Tar - это формат файла без центрального индекса, например, каждый файл в Tar имеет префикс с небольшим заголовком с информацией об имени, размере и прочем. Таким образом, чтобы получить конкретный файл, вы должны прочитать первый заголовок, проверить, соответствует ли он файлу, а если нет, пропустите размер ненужного файла и попробуйте следующий. С большим количеством меньших файлов в Tar это будет менее эффективно, чем загрузка полного файла (или, по крайней мере, загрузка до соответствующей части - вы можете проанализировать файл во время загрузки), потому что все эти новые подключения к данным для каждого чтения вызывают много накладных расходов. Но если у вас есть большие файлы в Tar, это может сработать.
Но вам совершенно не повезло, если это не ТАР (*.tar
), но TGZ (*.tgz
или же *.tar.gz
) файл. Это сжатые Tar-файлы, и для получения любой части файла вам нужно будет распаковать все, что у вас было раньше. Таким образом, в этом случае нет никакого способа загрузить файл или, по крайней мере, загрузить все до соответствующей части.