Извлеките файл в zipfile для другого конкретного пути - PullRequest
0 голосов
/ 08 июля 2019

Я работаю как с Windows, так и с Unix-путями, и у меня есть zip-файл со следующей структурой:

Main
   prog
      srcSample1.sh
      srcSample2.sh
   ctl
      confSample1.txt
      confSample2.txt 

Я должен скопировать файлы по разным путям, как показано ниже:

Скажите, что моей корневой папкой назначения в UNIX является / b / c / root /, тогда мой ожидаемый результат после копирования файла должен быть:

root
   src
      srcSample1.sh
      srcSample2.sh
   conf
      confSample1.txt
      confSample2.txt

Я пытался использовать функцию extract (), shutil.copy () и функцию открытой записи, но все они показывают разные проблемы.

С помощью extract () будут приняты значения в namelist (), и нет возможности его изменить.

При использовании shutil.copy () я не могу сослаться на файл в zip-файле, и он не может быть выполнен без такой ошибки файла.

Код с использованием метода extract ():

'''python
zipArtifacts = zipfile.ZipFile(zipFilePath, 'r')
zipFileList = zipArtifacts.namelist()

targetDir = functions.getTargetdir(somemappingfile) # Here I get the target mapping so that if its 'prog' the value will be 'src' and so on.

rootTargetDir= pathlib.Path(targetDir['root'])
rootTargetDir.mkdir(parents=True,exist_ok=True)

for artifact in zipFileList:
    if artifact.endswith('/'):
        print(artifact + " is a directory")
        newTargetDir = rootTargetDir
    else:
        artifactParts = artifact.split('/')
        artifactType = artifactParts[1]
        temp = '/'.join(artifactParts[2:])
        newTargetDir = rootTargetDir / targetDir[artifactType] / temp
    zipArtifacts.extract(artifact, newTargetDir)

'''

Код с использованием метода shutil.copy ():

'''python
zipArtifacts = zipfile.ZipFile(zipFilePath, 'r')
zipFileList = zipArtifacts.namelist()

targetDir = functions.getTargetdir(somemappingfile) # Here I get the target mapping so that if its 'prog' the value will be 'src' and so on.

rootTargetDir= pathlib.Path(targetDir['root'])
rootTargetDir.mkdir(parents=True,exist_ok=True)

for artifact in zipFileList:
    if artifact.endswith('/'):
        print(artifact + " is a directory")
    else:
        artifactParts = artifact.split('/')
        artifactType = artifactParts[1]
        temp = '/'.join(artifactParts[2:])
        newTargetDir = rootTargetDir / targetDir[artifactType] / temp
        shutil.copy(os.path.abspath(artifact), newTargetDir)
'''

код с использованием метода открытой записи:

'''python
zipArtifacts = zipfile.ZipFile(zipFilePath, 'r')
zipFileList = zipArtifacts.namelist()

targetDir = functions.getTargetdir(somemappingfile) # Here I get the target mapping so that if its 'prog' the value will be 'src' and so on.

rootTargetDir= pathlib.Path(targetDir['root'])
rootTargetDir.mkdir(parents=True,exist_ok=True)

for artifact in zipFileList:
    if artifact.endswith('/'):
        print(artifact + " is a directory")
    else:
        artifactParts = artifact.split('/')
        artifactType = artifactParts[1]
        temp = '/'.join(artifactParts[2:])
        outfile = open(str(rootTargetDir) + '\\' + targetDir[artifactType] + '\\' + temp, 'wb')
        outfile.write()
        outfile.close()


'''

Я не пытался сначала извлечь все файлы, а затем скопировать их в разные места назначения.

Из списка файлов в zip-файле я хочу записать их в выходные каталоги на основе их путей. т.е. не все файлы должны быть извлечены в один каталог, но целевой путь может измениться.

...