Ниже представлена структура папок:
Я попробовал приведенный ниже код, чтобы просто сохранить отчет .json
в выходной каталог, а также я хотел бы переименовать его так же, как имя файла untar
которое является 3884b56e33d16dd68faa4f1f25c28200.json
.
ниже приведен код:
import tarfile
import os
outdir=os.mkdir("C:\\Users\\esrilka\\Documents\\Tar Files\\Untar Files3")
t = tarfile.open("C:\\Users\\esrilka\\Documents\\Tar Files\\3884b56e33d16dd68faa4f1f25c28200.tar.gz", 'r')
for member in t.getmembers():
print(member)
if "autodiscovery/report" in member.name:
print("true")
t.extract(member='autodiscovery\report.json',path='outdir')
print (os.listdir('outdir'))
Как я могу просто сохранить отчет .json
в каталог вывода и переименовать файл.
Вы должны скрыть обратную косую черту с обратной косой чертой:
t.extract(member='autodiscovery\\report.json',path='outdir')
или вы можете использовать необработанную строку:
t.extract(member=r'autodiscovery\report.json',path='outdir')
Но тогда, когда у вас есть это условие:
if "autodiscovery/report" in member.name:
вместо этого вы должны использовать прямую косую черту для извлечения:
t.extract(member='autodiscovery/report.json',path='outdir')
Кроме того, os.mkdir
не возвращает имя каталога, которое оно outdir
, поэтому ваша переменная outdir
будет None
. Вы должны назначить путь к outdir
напрямую:
outdir="C:\\Users\\esrilka\\Documents\\Tar Files\\Untar Files3"
os.mkdir(outdir)
а затем использовать его для os.mkdir
и для извлечения (обратите внимание на отсутствие цитат вокруг outdir
):
t.extract(member='autodiscovery/report.json',path=outdir)
EDIT: теперь, когда вы упомянули, что хотите извлечь report.json
без каталога autodiscovery
который является частью его пути в tar файле, вам придется использовать метод extractfile
и написать содержимое в нужное место самостоятельно:
with open(os.path.join(outdir, 'report.json'), 'w') as f:
f.write(t.extractfile('autodiscovery/report.json').read())
Если вы хотите переименовать report.json
в имя файла tar, вы можете просто открыть файл с другим именем:
with open(os.path.join(outdir, '3884b56e33d16dd68faa4f1f25c28200.json'), 'w') as f:
и если вы хотите, чтобы это имя было таким же, как tar файл, дважды используйте os.path.splitext
для его получения (поскольку для вашего файла tar есть два имени расширения .tar
и .gz
), так что в начале вы должны сделать это:
archive = "C:\\Users\\esrilka\\Documents\\Tar Files\\3884b56e33d16dd68faa4f1f25c28200.tar.gz"
basename = os.path.basename(os.path.splitext(os.path.splitext(archive)[0])[0])
t = tarfile.open(archive, 'r')
а затем, когда вы откроете файл json для записи:
with open(os.path.join(outdir, basename + '.json'), 'w') as f:
print(member)
?
/
) вместо обратной косой черты (`\`). Python это поймет. :)