Переместить необходимые файлы туда, куда им нужно - PullRequest
0 голосов
/ 20 апреля 2011

Я работаю над скриптом Python, который распаковывает сжатый каталог и устанавливает некоторые файлы.Когда вы распаковываете сжатый файл, это могут быть файлы типа ./usr/bin/package или ./var/lib/package.Разархивированный каталог содержит имена каталогов, куда они действительно должны пойти.Допустим, структура каталогов выглядит следующим образом:

<code>
./zippedfile.zip
./usr
    /bin
        /package
./var
    ./lib
        ./package
Теперь мне нужно переместить необходимые файлы туда, куда они должны пойти.Например, мне нужно переместить ./usr/bin/package в актуальный каталог /usr/bin/.Дело в том, что невозможно предсказать, какие папки могут быть, поэтому сценарию необходимо найти необходимые каталоги и переместить их.Спасибо, надеюсь, я прояснил вопрос.

Ответы [ 3 ]

3 голосов
/ 20 апреля 2011

Используйте модуль zipfile для чтения zip-файла и extract(name, dest) для извлечения каждого файла. Например:

import sys
import zipfile

def unzip(path, root='/'):
    zh = zipfile.ZipFile(path, 'r')
    for name in zh.namelist():
        zh.extract(name, root)
    zh.close()

unzip(sys.argv[1])

Если файл в zip-файле имеет путь ./usr/bin/script, он будет извлечен в /usr/bin/script.

Использование:

% python unzip.py myfiles.zip

Обновление : Для обработки файлов tar используйте модуль tarfile . Это определяет тип сжатия, используя расширение файла (gzip, bzip2):

import os
import sys
import tarfile

def untar(path, root='/'):
    mode = 'r'
    _, ext = os.path.splitext(path)
    if ext in ('.gz', '.bz2'):
        mode += ':' + ext[1:]
    th = tarfile.open(path, mode)
    for info in th.getmembers():
        th.extract(info, root)
    th.close()

untar(sys.argv[1])

Обновлено Если вы не можете использовать модули zipfile или tarfile, вы можете вызвать соответствующие системные команды, чтобы получить те же результаты:

import os
import subprocess
import sys

def untar(path, root):
    subprocess.call(['tar', '-C', root, '-xf', path])

def unzip(path, root):
    subprocess.call(['unzip', os.path.abspath(path)], cwd=root)

path = sys.argv[1]
dest = os.path.abspath(sys.argv[2])
if not os.path.exists(dest):
    os.makedirs(dest)
if path.endswith('.zip'):
    unzip(path, dest)
else:
    untar(path, dest)
0 голосов
/ 20 апреля 2011

import zipfile, os
zipped = zipfile.ZipFile('zippedfile.zip')
os.chdir('/')
zipped.extractall()
0 голосов
/ 20 апреля 2011

Насколько я понимаю, многое из того, что вам нужно, находится в модуле os.path в стандартной библиотеке. Некоторые полезные функции там:

  • os.path.exists : Возвращает True, если путь ссылается на существующий путь. Возвращает False для неработающих символических ссылок. На некоторых платформах эта функция может возвращать False, если не предоставлено разрешение на выполнение os.stat () для запрошенного файла, даже если путь физически существует.

  • os.path.isdir : Возвращает True, если путь - это существующий каталог. Это следует за символическими ссылками, поэтому и islink (), и isdir () могут иметь значение true для одного и того же пути.

Если вам нужно вызвать команды оболочки для фактического перемещения каталогов, вы можете использовать модуль subprocess ( см. Документацию здесь ) также в стандартной библиотеке.

Надеюсь, это поможет.

...