Spaces:
Runtime error
Runtime error
File size: 5,484 Bytes
d7dbcdd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
import errno
import os
import shutil
import sys
import traceback
import zipfile
if sys.version_info[0] == 2:
import urllib2
else:
import urllib.request
# Converts a string to bytes (for writing the string into a file). Provided for
# compatibility with Python 2 and 3.
def StrToBytes(text):
if sys.version_info[0] == 2:
return text
else:
return bytes(text, 'UTF-8')
# Outputs the given text and lets the user input a response (submitted by
# pressing the return key). Provided for compatibility with Python 2 and 3.
def GetUserInput(text):
if sys.version_info[0] == 2:
return raw_input(text)
else:
return input(text)
# Creates the given directory (hierarchy), which may already exist. Provided for
# compatibility with Python 2 and 3.
def MakeDirsExistOk(directory_path):
try:
os.makedirs(directory_path)
except OSError as exception:
if exception.errno != errno.EEXIST:
raise
# Deletes all files and folders within the given folder.
def DeleteFolderContents(folder_path):
for file_name in os.listdir(folder_path):
file_path = os.path.join(folder_path, file_name)
try:
if os.path.isfile(file_path):
os.unlink(file_path)
else: #if os.path.isdir(file_path):
shutil.rmtree(file_path)
except Exception as e:
print('Exception in DeleteFolderContents():')
print(e)
print('Stack trace:')
print(traceback.format_exc())
# Creates the given directory, respectively deletes all content of the directory
# in case it already exists.
def MakeCleanDirectory(folder_path):
if os.path.isdir(folder_path):
DeleteFolderContents(folder_path)
else:
MakeDirsExistOk(folder_path)
# Downloads the given URL to a file in the given directory. Returns the
# path to the downloaded file.
# In part adapted from: https://stackoverflow.com/questions/22676
def DownloadFile(url, dest_dir_path):
file_name = url.split('/')[-1]
dest_file_path = os.path.join(dest_dir_path, file_name)
if os.path.isfile(dest_file_path):
print('The following file already exists:')
print(dest_file_path)
print('Please choose whether to re-download and overwrite the file [o] or to skip downloading this file [s] by entering o or s.')
while True:
response = GetUserInput("> ")
if response == 's':
return dest_file_path
elif response == 'o':
break
else:
print('Please enter o or s.')
url_object = None
if sys.version_info[0] == 2:
url_object = urllib2.urlopen(url)
else:
url_object = urllib.request.urlopen(url)
with open(dest_file_path, 'wb') as outfile:
meta = url_object.info()
file_size = 0
if sys.version_info[0] == 2:
file_size = int(meta.getheaders("Content-Length")[0])
else:
file_size = int(meta["Content-Length"])
print("Downloading: %s (size [bytes]: %s)" % (url, file_size))
file_size_downloaded = 0
block_size = 8192
while True:
buffer = url_object.read(block_size)
if not buffer:
break
file_size_downloaded += len(buffer)
outfile.write(buffer)
sys.stdout.write("%d / %d (%3f%%)\r" % (file_size_downloaded, file_size, file_size_downloaded * 100. / file_size))
sys.stdout.flush()
return dest_file_path
# Unzips the given zip file into the given directory.
def UnzipFile(file_path, unzip_dir_path, overwrite=True):
zip_ref = zipfile.ZipFile(open(file_path, 'rb'))
if not overwrite:
for f in zip_ref.namelist():
if not os.path.isfile(os.path.join(unzip_dir_path, f)):
zip_ref.extract(f, path=unzip_dir_path)
else:
print('Not overwriting {}'.format(f))
else:
zip_ref.extractall(unzip_dir_path)
zip_ref.close()
# Creates a zip file with the contents of the given directory.
# The archive_base_path must not include the extension .zip. The full, final
# path of the archive is returned by the function.
def ZipDirectory(archive_base_path, root_dir_path):
# return shutil.make_archive(archive_base_path, 'zip', root_dir_path) # THIS WILL ALWAYS HAVE ./ FOLDER INCLUDED
with zipfile.ZipFile(archive_base_path+'.zip', "w", compression=zipfile.ZIP_DEFLATED) as zf:
base_path = os.path.normpath(root_dir_path)
for dirpath, dirnames, filenames in os.walk(root_dir_path):
for name in sorted(dirnames):
path = os.path.normpath(os.path.join(dirpath, name))
zf.write(path, os.path.relpath(path, base_path))
for name in filenames:
path = os.path.normpath(os.path.join(dirpath, name))
if os.path.isfile(path):
zf.write(path, os.path.relpath(path, base_path))
return archive_base_path+'.zip'
# Downloads a zip file and directly unzips it.
def DownloadAndUnzipFile(url, archive_dir_path, unzip_dir_path, overwrite=True):
archive_path = DownloadFile(url, archive_dir_path)
UnzipFile(archive_path, unzip_dir_path, overwrite=overwrite)
def mkdir_p(path):
try:
os.makedirs(path)
except OSError as exc: # Python >2.5
if exc.errno == errno.EEXIST and os.path.isdir(path):
pass
else:
raise
|