Source code for neurokit2.data.database
import pathlib
import urllib
import zipfile
[docs]
def download_from_url(url, destination_path=None):
"""**Download Files from URLs**
Download a file from the given URL and save it to the destination path.
Parameters
----------
url : str
The URL of the file to download.
destination_path : str, Path
The path to which the file will be downloaded. If None, the file name will be taken
from the last part of the URL path and downloaded to the current working directory.
Returns
-------
bool
True if the file was downloaded successfully, False otherwise.
"""
destination_path = _download_path_sanitize(url, destination_path)
# Download the file
response = urllib.request.urlopen(url)
if response.status_code == 200:
with destination_path.open("wb") as file:
file.write(response.content)
return True
else:
return False
[docs]
def download_zip(url, destination_path=None, unzip=True):
"""**Download ZIP files**
Download a ZIP file from a URL and extract it to a destination directory.
Parameters
----------
url : str
The URL of the ZIP file to download.
destination_path : str, Path
The path to which the ZIP file will be extracted. If None, the folder name will be taken
from the last part of the URL path and downloaded to the current working directory.
unzip : bool
Whether to unzip the file or not. Defaults to True.
Returns
-------
bool
True if the ZIP file was downloaded successfully, False otherwise.
"""
destination_path = _download_path_sanitize(url, destination_path)
destination_directory = pathlib.Path(destination_path).parent
# Ensure that the destination path is a Path object ending with ".zip"
zip_filepath = pathlib.Path(destination_path)
if zip_filepath.suffix != ".zip":
zip_filepath = pathlib.Path(zip_filepath.parent, zip_filepath.name + ".zip")
# Download the ZIP file
download_successful = download_from_url(url, zip_filepath)
if download_successful:
if unzip:
# Extract the ZIP file
with zipfile.ZipFile(zip_filepath, "r") as zip_ref:
extracted_folder_name = pathlib.Path(zip_ref.namelist()[0]).parts[0]
# Extract the contents
zip_ref.extractall(destination_directory)
# Rename the extracted folder to the desired name
extracted_folder_path = destination_directory / extracted_folder_name
new_folder_path = (
destination_directory / pathlib.Path(destination_path).name
)
extracted_folder_path.rename(new_folder_path)
# Clean up by removing the downloaded ZIP file
zip_filepath.unlink()
return True
else:
return False
def _download_path_sanitize(url, destination_path=None):
"""Sanitize the destination path of a file to be downloaded from a URL.
Parameters
----------
url : str
The URL of the file to download.
destination_path : str, Path
The path to which the file will be downloaded. If None, the file name will be taken
from the last part of the URL path and downloaded to the current working directory.
Returns
-------
Path
The sanitized destination path.
"""
if destination_path is None:
# Name the file to be downloaded after the last part of the URL path
url_parts = urllib.parse.urlsplit(url)
destination_path = pathlib.Path(url_parts.path).name
# Ensure that the destination path is a Path object
destination_path = pathlib.Path(destination_path)
# Create the destination directory if it does not exist
destination_directory = destination_path.parent
pathlib.Path(destination_directory).mkdir(parents=True, exist_ok=True)
return destination_path