Just my solution to the project
I found the solution to the project provided in the book really good, but it zipped the entire folder structure in the absolute path. Something I am not pleased with. By adding the filepath base name to the zipfile.Zipfile.write() function, after the absolute file path (of the file to be written), I was able to prevent that unnecessary folder zipping.
Code
# Backs up given file in a zip file and numbers accordingly
# Usage: python backupzip
import sys
import os
import re
import zipfile
# TODO: get filepath
if len(sys.argv) == 2:
filepath = sys.argv[1]
filepath = os.path.abspath(filepath)
# TODO: check if file path is valid
if os.path.exists(filepath):
# TODO: get list of files in the current directory
backupNum = 1
filepath_name = os.path.basename(filepath)
filepath_name = filepath_name.split(".")
regex_pattern = "^{}_\d+.zip$".format(filepath_name[0])
regExp = re.compile(regex_pattern)
for filename in os.listdir():
# TODO: get number of files with filename
match = regExp.match(filename)
if match:
backupNum += 1
# TODO: create zipfile and zip filepath
name = filepath_name[0] + "_" + str(backupNum) + ".zip"
textZip = zipfile.ZipFile(name, "w")
# TODO: walk through entire folder tree
mainfolder = os.path.dirname(filepath)
print("Main folder ", mainfolder)
for dirpath, subfolders, files in os.walk(filepath):
dirname = os.path.basename(dirpath)
print("Adding files from {}".format(dirpath))
# extract relative folder path
[misc, relative_folder_path] = dirpath.split(mainfolder)
newpath = os.path.join(relative_folder_path )
print("New Path : {}".format(newpath))
textZip.write(dirpath, newpath)
for file in files:
print(file)
filp = os.path.join(dirpath, file)
textZip.write(filp, os.path.join(relative_folder_path, file),
compress_type=zipfile.ZIP_DEFLATED)
textZip.close()
else:
print("given file path does not exists")
else:
print("Usage: python backupzip ")