Azure Storage Server desde FTP
Carga de datos csv desde un servicio FTP hacia un contenedor en Azure con Python.
Uno de los servicios básicos de Azure es el Storage accounts, que implementa un repositorio de archivos que se agrupa en contenedores para almacenar todos los tipos de documentos y archivos binarios necesarios. También se crean en forma automática para almacenar datos de otros servicios como el uso de machine learning.
El objetivo de este ejemplo es cargar una serie de archivos csv hacia un contenedor especifico dentro de un servicio de almacenamiento blob en Azure, en este caso reemplazando los datos prexistentes.
# 1. conecta con servidor FTP
# 2. descarga los archivos elegidos hacia carpeta temporal
# 3. subir cada archivo hacia el contenedor 'contenedor' definido en Azure Storage Accounts
from ftplib import FTP
import os
from pathlib import Path
import logging
from azure.storage.blob import BlobClient
# variable de conexion establecida en Azure Services
connect_str = os.environ["AZURE_STORAGE_CONNECTION_STRING"]
AZURE_STORAGE_CONNECTION_STRING es una variable de conexión que se establecen en Azure. De esa manera se resguarda la seguridad de las claves de acceso y otra información sensible. Todas las variables de conexión y parámetros se pueden establecer en el área de configuración de la función. Lo mismo aplica para las variables de conexión al servicio FTP.
def conecta_FTP():
Host = os.environ["ftp_host"]
Puerto = os.environ["ftp_port"]
Cuenta = os.environ["ftp_cuenta"]
Pass = os.environ["ftp_pwd"]
connFTP = [Host, Puerto, Cuenta, Pass]
return connFTP
def csv_ftp():
connFTP = conecta_FTP() # funcion que extrae las variables de configuración definidas en la configuración de la función en Azure.
Host = str(connFTP[0])
Port = int(connFTP[1])
User = str(connFTP[2])
Pass = str(connFTP[3])
ftp = FTP()
ftp.connect(Host, Port, timeout=1000)
ftp.login(user=User, passwd=Pass)
files = ['archivo_1.csv', 'archivo_2.csv', 'archivo_3.csv',
'archivo_4.csv', 'archivo_5.csv', 'archivo_6.csv']
for j in range(len(files)):
filename = files[j]
filenameDestino = filename
try:
local_filename = os.path.join(r"/tmp/", filenameDestino)
localfile = open(local_filename, "wb")
ftp.retrbinary("RETR " + filenameDestino, localfile.write)
localfile.close()
# sube el archivo csv hacia un contenedor de nombre 'contenedor' de Azure.
blob = BlobClient.from_connection_string(conn_str=connect_str, container_name='contenedor', blob_name=filenameDestino)
with open(file=local_filename, mode="rb") as file:
blob.upload_blob(file, overwrite=True)
except ValueError:
logging.info("Error " + ValueError)
if __name__ == "__main__":
csv_ftp()
Código fuente disponible en https://github.com/paranedagarcia/Azure-funciones