Возникли проблемы при использовании zipfile.ZipFile.extractall (уже прочитал документы) - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть папка со многими zip-файлами, большинство из которых содержат шейп-файлы, а некоторые имеют подпапки, которые содержат zip-файлы, которые содержат шейп-файлы. Я пытаюсь извлечь все в одну основную папку без сохранения структуры папки . Вот где я сейчас нахожусь;

    import os, zipfile

def getListOfFiles(dirName):
    # create a list of file and sub directories
    # names in the given directory
    listOfFile = os.listdir(dirName)
    allFiles = list()
    # Iterate over all the entries
    for entry in listOfFile:
        # Create full path
        fullPath = os.path.join(dirName, entry)
        # If entry is a directory then get the list of files in this directory
        if os.path.isdir(fullPath):
            allFiles = allFiles + getListOfFiles(fullPath)
        else:
            allFiles.append(fullPath)

    return allFiles


def main():
    dirName = r'C:\Users\myusername\My_Dataset'

    # Get the list of all files in directory tree at given path
    listOfFiles = getListOfFiles(dirName)

    # Print the files
    for elem in listOfFiles:
        print(elem)
        zipfile.ZipFile.extractall(elem)

    print("****************")


if __name__ == '__main__':
    main()

Этот скрипт печатает все шейп-файлы (включая те, которые находятся в подпапках). Теперь мне нужно извлечь все эти перечисленные шейп-файлы в одну основную папку. Я пытаюсь zipfile.ZipFile.extractall(elem), но это не работает.

line 1611, in extractall
    members = self.namelist()
AttributeError: 'str' object has no attribute 'namelist'

Ошибка, которую я получаю. zipfile.ZipFile.extractall(elem) это строка, которая не работает. Я предполагаю, что он ожидает один zip-файл, но я пытаюсь скормить ему папку (или список в данном случае?)

Как мне изменить этот скрипт, чтобы он извлекал мои перечисленные шейп-файлы в папку (предпочтительно новая папка)

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Сначала необходимо создать экземпляр ZipFile и использовать extractall в этом экземпляре:

for elem in listOfFiles:
     my_zipfile = zipfile.ZipFile(elem)
     my_zipfile.extractall()
0 голосов
/ 11 февраля 2020

Я добавил этот блок кода в мой скрипт, и теперь он работает.

def getfiles (путь): если os.path.isdir (путь): для root, каталоги, файлы в os.walk (путь): для имени в файлах: yield os.path.join ( root, имя) иначе: путь выхода

fromdir = r"C:\Users\username\My_Dataset\new"
for f in getfiles(fromdir):
    filename = str.split(f, '/')[-1]
    if os.path.isfile(destination + filename):
        filename = f.replace(fromdir, "", 1).replace("/", "_")
    # os.rename(f, destination+filename)
    shutil.copy2(f, r"C:\Users\username\Documents\flatten")
...