Я надеюсь, что не буду дублировать здесь, но я не нашел решения до сих пор, так как ответы не включают подпапки. У меня есть zipfile, который содержит папку, которая содержит файлы и подпапки.
Я хочу извлечь файлы из папки (my_folder
) и подпапки по указанному пути c: Users/myuser/Desktop/another
. Я хочу только файлы и подпапки в another dir
. С моим текущим кодом происходит то, что создается каталог my_folder, в который помещаются мои файлы и подпапки. Но я не хочу, чтобы этот каталог создавался. Вот что я делаю:
with zipfile.ZipFile("Users/myuser/Desktop/another/my_file.zip", "r") as zip_ref:
zip_ref.extractall(Users/myuser/Desktop/another)
Я попытался перечислить все zip-файлы в папке и извлечь их вручную:
with ZipFile('Users/myuser/Desktop/another/myfile.zip', 'r') as zipObj:
# Get a list of all archived file names from the zip
listOfFileNames = zipObj.namelist()
for fileName in new_list_of_fn:
print(fileName)
zipObj.extract(fileName, 'Users/myuser/Desktop/another/')
Это дает тот же результат. Я попытался создать новый список, удалив имена, чтобы они больше не включали в себя имя папки, но затем он сообщает, что в архиве нет элемента с именем xyz.
Наконец-то я воспользовался этими двумя вопросами / кодом ( извлечь zip-файл без папки python и Извлечь файлы из zip без сохранения структуры, используя python ZipFile? ) и это работает, , но только если нет вложенных папок . Если есть подпапки, выдает ошибку FileNotFoundError: [Errno 2] No such file or directory: ''
. Однако я хочу, чтобы файлы в подкаталоге извлекались в подкаталог.
Я могу использовать этот код, только если пропущу все каталоги:
my_zip = Users/myuser/Desktop/another/myfile.zip
my_dir = Users/myuser/Desktop/another/
with zipfile.ZipFile(my_zip, 'r') as zip_file:
for member in zip_file.namelist():
filename = os.path.basename(member)
print(filename)
# skip directories
if not filename:
continue
# copy file (taken from zipfile's extract)
source = zip_file.open(member)
target = open(os.path.join(my_dir, filename), "wb")
with source, target:
shutil.copyfileobj(source, target)
Так что я ищу способ сделать это, который бы также извлекал подкаталоги в их соответствующие каталоги. Это означает, что мне нужна структура в / Users / myuser / Desktop / other:
-file1
-file2
-file3
...
- subfolder
-file1
-file2
-file3
...
У меня такое ощущение, что это должно быть выполнимо с shututil
, но я не знаю, как ...
Есть ли способ, которым я могу это сделать? Большое спасибо за любую помощь. Очень ценится.