alwaysaskingquestions
alwaysaskingquestions

Reputation: 1657

why zipfile trying to unzip xlsx files?

I am trying to use the following code to unzip all the zip folders in my root folder; this code was found on this thread:

Unzip zip files in folders and subfolders with python

rootPath = u"//rootdir/myfolder" # CHOOSE ROOT FOLDER HERE
pattern = '*.zip'
for root, dirs, files in os.walk(rootPath):
    for filename in fnmatch.filter(files, pattern):
        print(os.path.join(root, filename))
        zipfile.ZipFile(os.path.join(root, filename)).extractall(os.path.join(root, os.path.splitext(filename)[0]))

but I keep getting this error that says FileNotFoundError saying the xlsx file does not exist:

Traceback (most recent call last):
  File "//rootdir/myfolder/Python code/unzip_helper.py", line 29, in <module>
    zipfile.ZipFile(os.path.join(root, filename)).extractall(os.path.join(root, os.path.splitext(filename)[0]))
  File "//rootdir/myfolder/Python\Python36-32\lib\zipfile.py", line 1491, in extractall
    self.extract(zipinfo, path, pwd)
  File "//myaccount/Local\Programs\Python\Python36-32\lib\zipfile.py", line 1479, in extract
    return self._extract_member(member, path, pwd)
  File "//myaccount/Local\Programs\Python\Python36-32\lib\zipfile.py", line 1542, in _extract_member
    open(targetpath, "wb") as target:

FileNotFoundError: [Errno 2] No such file or directory: '\\rootdir\myfolder\._SGS Naked 3 01 WS Kappa Coated and a very long very long file name could this be a problem i dont think so.xlsx'

My question is, why would it want to unzip this excel file anyways?!

And how can I get rid of the error?

I've also tried using r instead of u for rootPath:

rootPath = r"//rootdir/myfolder"

and I get the same error.

Any help is truly appreciated!

Upvotes: 0

Views: 1347

Answers (1)

GIZ
GIZ

Reputation: 4633

Some filenames and directory names may have extra dots in their names, as a consequence the last line, unlike Windows filenames can have dots on Unix:

zipfile.ZipFile(os.path.join(root, filename)).extractall(os.path.join(root, os.path.splitext(filename)[0]))

this line fails. To see how that happens:

>>> filename = "my.arch.zip"
>>> root = "/my/path/to/mydir/"
>>> os.path.join(root, os.path.splitext(filename)[0])
'/my/path/to/mydir/my.arch'

With or without extra dots, problems will still take place in your code:

>>> os.path.join(root, os.path.splitext(filename)[0])
'/my/path.to/mydir/arch'

If no '/my/path.to/mydir/arch' can be found, FileNotFoundError will be raised. I suggest that you be explicit in you path, otherwise you have to ensure the existence of those directories.

ZipFile.extractall(path=None, members=None, pwd=None)

Extract all members from the archive to the current working directory. path specifies a different directory to extract to...

Unless path is an existent directory, FileNotFoundError will be raised.

Upvotes: 1

Related Questions