Я работаю как с 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-файле я хочу записать их в выходные каталоги на основе их путей. т.е. не все файлы должны быть извлечены в один каталог, но целевой путь может измениться.