Python не распознает zip-файлы как zip-файлы - PullRequest
0 голосов
/ 31 января 2020

Я перебираю каталоги и хочу найти все zip-файлы и добавить их в download_all.zip. Я уверен, что есть zip-файлы, но Python не распознает эти zip-файлы как zip-файлы. Почему это так?

мой код:

os.chdir(boardpath)
# zf = zipfile.ZipFile('download_all.zip', mode='w')
z = zipfile.ZipFile('download_all.zip', 'w') #creating zip download_all.zip file

for path, dirs, files in os.walk(boardpath):
    for file in files:
        print file
        if file.endswith('.zip'): # find all zip files
                print ('adding', file)
                z.write(file) # error shows: doesn't file is a str object, not a zip file

z.close()
z = zipfile.ZipFile("download_all.zip")
z.printdir()

Я пытался:

file.printdir()
# I got the following error: AttributeError: 'str' object has no attribute 'printdir'

Ответы [ 4 ]

1 голос
/ 31 января 2020

Как указано в do c файла ZipFile.write, аргумент filename должен относиться к архиву root. Итак, следующая строка:

z.write(file)

Должно быть:

z.write(os.path.relpath(os.path.join(path, file)))
1 голос
/ 31 января 2020

zipfile.Zipfile.write (имя), имя фактически означает полный путь к файлу, а не просто имя файла.

import os #at the top

 if file.endswith('.zip'): # find all zip files  
    filepath = os.path.join(path, file)
    print ('adding', filepath) 
    z.write(filepath) # error
0 голосов
/ 31 января 2020

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

import os 
import Zipfile
with zipfile.ZipFile('download_all.zip', 'w') as zf:
    for path, dirs, files in os.walk('/some_path'):
        for file in files:
            if file.endswith('.zip'):
                zf.write(os.path.join(path, file))
0 голосов
/ 31 января 2020

files, которые os/walk() дают, являются списками имен файлов. Эти имена файлов - просто строки (в которых нет метода printdir()).

...