Распаковка файла с подпапками в тот же каталог без создания дополнительной папки - PullRequest
0 голосов
/ 15 апреля 2020

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

Есть ли способ, которым я могу это сделать? Большое спасибо за любую помощь. Очень ценится.

...