Currently, I have a list containing a few more lists as follows:
Each index contains the name of the folder that I want to create and at the next index contains the image that I want to upload to google drive. When uploading, I want to rename each image according to the folder names:
Example:
The first index of the list has a few information as above.
I want to create a folder named "13910171322" and since there are 3 JPEG files when uploaded to the "13910171322" folder, they will be renamed "13910171322-1, 13910171322-2, 13910171322-3".
This process will be done for each index in the "list_image" list meaning that I would expect the google drive parent folder to have 6 folders with different names containing JPEG image files that are already renamed according to their folder name
*plus numbering 1/2/3 according to the amount of JPEG files in the folder.
(Ex: if in the list there are 5 JPEG files, the naming of each image will go up to 5).
Expected Result (this example is created manually)
There are 6 folders (since the length of the "list_image" list is 6)
The folder "13910171322" will have 3 images renamed accordingly.
From my research and tutorial (https://www.youtube.com/watch?v=uI220BJ0yXc), I found that the way is to create a folder first, then upload the images. For creating new folders, I found that the following code can be used:
import pickle
import os
from google_auth_oauthlib.flow import Flow, InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload, MediaIoBaseDownload
from google.auth.transport.requests import Request
def Create_Service(client_secret_file, api_name, api_version, *scopes):
print(client_secret_file, api_name, api_version, scopes, sep='-')
CLIENT_SECRET_FILE = client_secret_file
API_SERVICE_NAME = api_name
API_VERSION = api_version
SCOPES = [scope for scope in scopes[0]]
print(SCOPES)
cred = None
pickle_file = f'token_{API_SERVICE_NAME}_{API_VERSION}.pickle'
#print(pickle_file)
if os.path.exists(pickle_file):
with open(pickle_file, 'rb') as token:
cred = pickle.load(token)
if not cred or not cred.valid:
if cred and cred.expired and cred.refresh_token:
cred.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRET_FILE, SCOPES)
cred = flow.run_local_server()
with open(pickle_file, 'wb') as token:
pickle.dump(cred, token)
try:
service = build(API_SERVICE_NAME, API_VERSION, credentials=cred)
print(API_SERVICE_NAME, 'service created successfully')
return service
except Exception as e:
print('Unable to connect.')
print(e)
return None
def convert_to_RFC_datetime(year=1900, month=1, day=1, hour=0, minute=0):
dt = datetime.datetime(year, month, day, hour, minute, 0).isoformat() + 'Z'
return dt
After creating the functions, then we execute them. I use the following code to execute the function:
CLIENT_SECRET_FILE = r'/content/drive/MyDrive/2. Tools/Product Image Downloader/client_secret_GoogleCloudDemo.json'
API_NAME = 'drive'
API_VERSION = 'v3'
SCOPES = ['https://www.googleapis.com/auth/drive']
service = Create_Service(CLIENT_SECRET_FILE, API_NAME, API_VERSION, SCOPES)
It returns an error as follows:
/content/drive/MyDrive/2. Tools/Product Image Downloader/client_secret_GoogleCloudDemo.json-drive-v3-(['https://www.googleapis.com/auth/drive'],)
['https://www.googleapis.com/auth/drive']
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
<ipython-input-14-8479496aee48> in <module>()
4 SCOPES = ['https://www.googleapis.com/auth/drive']
5
----> 6 service = Create_Service(CLIENT_SECRET_FILE, API_NAME, API_VERSION, SCOPES)
6 frames
/usr/lib/python3.7/socketserver.py in server_bind(self)
464 if self.allow_reuse_address:
465 self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
--> 466 self.socket.bind(self.server_address)
467 self.server_address = self.socket.getsockname()
468
OSError: [Errno 98] Address already in use
Actually I have the following code below it to create the folders:
kodeproduk = [13910171322, 13703488271, 13504034138, 13303499936, 13004044291, 12803211256]
for i in kodeproduk:
file_metadata = {
'name': i,
'mimetype': 'application/vnd.google-apps.folder',
'parents': exportID
}
service.files().create(body= file_metadata).execute()
FULL SCRIPT
#Library Install
import pandas as pd
import numpy as np
import glob
import openpyxl
#Connecting Drive with Colab
from google.colab import drive
drive.mount('/content/drive')
from google.colab import auth
auth.authenticate_user()
import gspread
from google.auth import default
creds, _ = default()
gc = gspread.authorize(creds)
# Import PyDrive and associated libraries.
# This only needs to be done once per notebook.
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials
import os
# Authenticate and create the PyDrive client.
# This only needs to be done once per notebook.
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)
from PIL import Image
import requests
from io import BytesIO
from __future__ import print_function
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
path_list = []
path_awal = r'/content/drive/MyDrive/2. Tools/Product Image Downloader/Upload Data Here (Image Downloader)'
path1 = glob.glob(path_awal + "/*.xlsx")
path2 = glob.glob(path_awal + "/*.xlsm")
path_list.extend(path1)
path_list.extend(path2)
path = path_list[0]
df = pd.read_excel(path)
df = df[['Kode Produk', 'Foto Sampul', 'Foto Produk 1', 'Foto Produk 2', 'Foto Produk 3', 'Foto Produk 4', 'Foto Produk 5', 'Foto Produk 6', 'Foto Produk 7', 'Foto Produk 8']]
df = df.fillna('')
kodeproduk = list(df['Kode Produk'])
jumlahproduk = list(range(0, len(df)))
jumlahgambar = list(range(1, (len(df.columns))))
list_image = []
for i in jumlahproduk:
local_image = []
local_image.append(kodeproduk[i])
for a in jumlahgambar:
if (df.loc[i][a]) != "":
url = df.loc[i][a]
response = requests.get(url)
img = Image.open(BytesIO(response.content))
local_image.append(img)
else:
pass
list_image.append(local_image)
exportID = '1NIXxYlJybN9ihUx5EfOllpxpwUWEqm4f'
def createRemoteFolder(folderName=None, parentID = None):
# Create a folder on Drive, returns the newely created folders ID
body = {
'name': folderName,
'mimeType': "application/vnd.google-apps.folder"
}
if parentID:
body['parents'] = [parentID]
root_folder = drive.files().create(body = body).execute()
return root_folder['id']
import pickle
import os
from google_auth_oauthlib.flow import Flow, InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload, MediaIoBaseDownload
from google.auth.transport.requests import Request
def Create_Service(client_secret_file, api_name, api_version, *scopes):
print(client_secret_file, api_name, api_version, scopes, sep='-')
CLIENT_SECRET_FILE = client_secret_file
API_SERVICE_NAME = api_name
API_VERSION = api_version
SCOPES = [scope for scope in scopes[0]]
print(SCOPES)
cred = None
pickle_file = f'token_{API_SERVICE_NAME}_{API_VERSION}.pickle'
#print(pickle_file)
if os.path.exists(pickle_file):
with open(pickle_file, 'rb') as token:
cred = pickle.load(token)
if not cred or not cred.valid:
if cred and cred.expired and cred.refresh_token:
cred.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRET_FILE, SCOPES)
cred = flow.run_local_server()
with open(pickle_file, 'wb') as token:
pickle.dump(cred, token)
try:
service = build(API_SERVICE_NAME, API_VERSION, credentials=cred)
print(API_SERVICE_NAME, 'service created successfully')
return service
except Exception as e:
print('Unable to connect.')
print(e)
return None
def convert_to_RFC_datetime(year=1900, month=1, day=1, hour=0, minute=0):
dt = datetime.datetime(year, month, day, hour, minute, 0).isoformat() + 'Z'
return dt
CLIENT_SECRET_FILE = r'/content/drive/MyDrive/2. Tools/Product Image Downloader/client_secret_GoogleCloudDemo.json'
API_NAME = 'drive'
API_VERSION = 'v3'
SCOPES = ['https://www.googleapis.com/auth/drive']
service = Create_Service(CLIENT_SECRET_FILE, API_NAME, API_VERSION, SCOPES)
for i in kodeproduk:
file_metadata = {
'name': i,
'mimetype': 'application/vnd.google-apps.folder',
'parents': exportID
}
service.files().create(body= file_metadata).execute()