Обновлено с новой информацией из OP:
Вы перебираете все дерево каталогов с os.walk()
. Похоже, вы хотите просто посмотреть на файлы в данном каталоге. Для этого рассмотрим os.scandir()
, который возвращает итератор всех файлов и подкаталогов в данном каталоге. Вам просто нужно отфильтровать элементы, которые являются каталогами:
root = "/home/rob/Desktop/projects/zenjobv2"
for entry in os.scandir(root):
if entry.is_dir():
continue # Just in case there are strangely-named directories
if entry.path.endswith(".pdf") or entry.path.endswith(".xml"):
# Process the file at entry.path as you see fit
Предыдущий ответ, основанный на плохом понимании вопроса:
Вы неявно указываете аргумент arcname
в вашем вызове ZipFile.write()
, который создаст файл в архиве с точным указанным вами путем, подкаталогами и всем. Если файл, который вы добавляете в архив, находится по пути /home/rob/Desktop/projects/zenjobv2/subdir1/subdir2/file.pdf
, то, используя определение os.path.relpath()
, ваш код фактически преобразуется в:
fantasy_zip.write("/home/rob/Desktop/projects/zenjobv2/subdir1/subdir2/file.pdf",
arcname="subdir1/subdir2/file.pdf",
compress_type=zipfile.ZIP_DEFLATED)
, поскольку arcname
аргумент содержит разделители каталогов, файл будет добавлен в архив в подкаталоге с именем subdir1/subdir2
.
Вы, вероятно, намереваетесь сделать что-то вроде этого:
fantasy_zip.write(os.path.join(folder, file), arcname=file)
Этооставит структуру каталогов вне архива. Однако следует помнить, что файлы с одинаковыми именами будут перезаписаны.