Python es un lenguaje genial, tan pronto como termines tus primeros proyectos con él, quedarás empeñado. Es un lenguaje de propósito general y está ganando popularidad en los últimos años entre los científicos e ingenieros de datos. Personalmente, recomiendo Python a los novatos, especialmente a los adolescentes, no solo porque tiene una curva de aprendizaje directa simple, sino también porque tiene una gran comunidad y un rico ecosistema.
Acerca de este tutorial
Estaba ayudando a un amigo a resolver problemas dividiéndolos en pequeños problemas y resolviéndolos uno por uno. Así que aquí está la asignación de código como el problema principal que estamos tratando de resolver.
El problema:Utilice Python para cargar e importar archivos CSV en una tabla predefinida en la base de datos MySQL.
Pasos
- Crear formulario de carga de archivos
- Sube el CSV usando Flask
- Analizar datos de archivos CSV
- Conéctese a la base de datos
- Insertar filas en una tabla específica en la base de datos
Pila que usaremos:
- Matraz;Un marco web Python Minimal (Micro).
- mysql;Si usas Windows puedes usar WAMP o XAMPP, si usas Linux XAMPP es una buena opción. Si utiliza macOS, XAMPP o MAMP son buenas soluciones.
- pandasPandas es una biblioteca de Python de código abierto para análisis y manipulación de datos. Es ampliamente utilizado entre científicos e ingenieros de datos.
- conector.mysql; La biblioteca que usaremos para conectarnos a la base de datos MySQL e insertar los datos.
Requisitos
- Instale Flask; aquí instalaré Python directamente con
pip
pero recomiendo encarecidamente usarpython-virtualenv
para las mejores prácticas.
pip install Flask
- Instale XAMPP; El paquete XAMPP incluirá la base de datos MySQL y PHPMyAdmin para administrar nuestras bases de datos MySQL.
- Instale las bibliotecas necesarias (Pandas, sql.connector)
pip install pandas
pip install sql.connector
- Un archivo CSV de muestra que usaré
addresses.csv
de aquí.
0 Prepara el matraz
Ahora probemos si Flask funciona comenzando a crear nuestro archivo principal. main.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Flask CSV Filer Uploader and Parser"
if (__name__ == "__main__"):
app.run(port = 5000)
Podemos ejecutar el archivo por $ python main.py
luego dirigiéndose ahttp://127.0.0.1:5000/
.
Si todo va según lo planeado, recibirá el mensaje renderizado.
El siguiente paso es crear la página HTML que será responsable de cargar los archivos CSV.
1- Crear formulario de carga de archivos
Vamos a crear templates
directorio y nuestro formulario de carga HTML en él.
<!doctype html>
<html>
<head>
<title>FLASK CSV File Upload</title>
</head>
<body>
<h1>Upload your CSV file</h1>
<form method="POST" action="" enctype="multipart/form-data">
<p><input type="file" name="file"></p>
<p><input type="submit" value="Submit"></p>
</form>
</body>
</html>
2- Sube los archivos al servidor.
Ahora necesitamos aceptar los archivos entrantes de este formulario, agreguemos la función razonable en main.py
from flask import Flask, render_template, request, redirect, url_for
import os
from os.path import join, dirname, realpath
app = Flask(__name__)
# enable debugging mode
app.config["DEBUG"] = True
# Upload folder
UPLOAD_FOLDER = 'static/files'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
# Root URL
@app.route('/')
def index():
# Set The upload HTML template '\templates\index.html'
return render_template('index.html')
# Get the uploaded files
@app.route("/", methods=['POST'])
def uploadFiles():
# get the uploaded file
uploaded_file = request.files['file']
if uploaded_file.filename != '':
file_path = os.path.join(app.config['UPLOAD_FOLDER'], uploaded_file.filename)
# set the file path
uploaded_file.save(file_path)
# save the file
return redirect(url_for('index'))
if (__name__ == "__main__"):
app.run(port = 5000)
Como todo está configurado, podemos probar la carga del archivo ahora en http://127.0.0.1:5000/
Si todo está bien, puedes ver los archivos subidos en /static/files/
3- Analizar el archivo CSV
Para analizar los datos del archivo CSV en filas, usaremos pandas
la biblioteca de análisis y manipulación de datos.
- Importar la biblioteca
import pandas as pd
Función de análisis CSV
def parseCSV(filePath):
# CVS Column Names
col_names = ['first_name','last_name','address', 'street', 'state' , 'zip']
# Use Pandas to parse the CSV file
csvData = pd.read_csv(filePath,names=col_names, header=None)
# Loop through the Rows
for i,row in csvData.iterrows():
print(i,row['first_name'],row['last_name'],row['address'],row['street'],row['state'],row['zip'],)
No olvides agregar parseCSV(file_path)
funcionar poco después de guardar el archivo en uploadFiles
# Output
0 John Doe 120 jefferson st. Riverside NJ 8075
1 Jack McGinnis 220 hobo Av. Phila PA 9119
2 John "Da Man" Repici 120 Jefferson St. Riverside NJ 8075
3 Stephen Tyler 7452 Terrace "At the Plaza" road SomeTown SD 91234
4 nan Blankman nan SomeTown SD 298
5 Joan "the bone", Anne Jet 9th, at Terrace plc Desert City CO 123
4- Conéctese a la base de datos (XAMPP/ MySQL)
- En este paso nos conectaremos a la base de datos y nos aseguraremos de que funcione.
- Agregar
import mysql.connector
- Conéctese al servidor MySQL
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
password="",
database="databaseName"
)
Asegúrese de reemplazar los condicionales correctamente.
- Para probar la conexión de la base de datos, enumeremos todas las bases de datos disponibles:
mycursor = mydb.cursor()
mycursor.execute("SHOW DATABASES")
# List All Databases
for x in mycursor:
print(x)
Cree la base de datos y la tabla en la que desea insertar las filas con los nombres de las columnas correspondientes.
5- Insertar filas en la base de datos
Con este paso simplemente actualizaremos nuestro bucle para insertar cada fila en la base de datos.
def parseCSV(filePath):
# CVS Column Names
col_names = ['first_name','last_name','address', 'street', 'state' , 'zip']
# Use Pandas to parse the CSV file
csvData = pd.read_csv(filePath,names=col_names, header=None)
# Loop through the Rows
for i,row in csvData.iterrows():
sql = "INSERT INTO addresses (first_name, last_name, address, street, state, zip) VALUES (%s, %s, %s, %s, %s, %s)"
value = (row['first_name'],row['last_name'],row['address'],row['street'],row['state'],str(row['zip']))
mycursor.execute(sql, value, if_exists="append")
mydb.commit()
print(i,row['first_name'],row['last_name'],row['address'],row['street'],row['state'],row['zip'])
Como todo va según lo previsto, comprueba las nuevas entradas de datos en la base de datos.
Solución de problemas y práctica
Al concluir este tutorial, aquí hay algunas soluciones de problemas e ideas para continuar y practicar.
NaN
; no enviarNaN
valores a la base de datos- Utilice el formulario seguro para conocer las mejores prácticas
- Cree e inserte tablas/columnas basadas en la estructura CSV
- Insertar solo valores nuevos
- Establecer opciones de carga: aceptar solo archivos CSV, limitar el tamaño del archivo
- Sube varios archivos
- Mover archivos terminados a
done
directamente tan pronto como se insertan - Mejor gestión de errores
- Enumere todos los archivos realizados y cargados en
index.html
- Ver tabla CSV en
index.html
- Convertir el
csv
enjson
código completo
main.py
from flask import Flask, render_template, request, redirect, url_for
import os
from os.path import join, dirname, realpath
import pandas as pd
import mysql.connector
app = Flask(__name__)
# enable debugging mode
app.config["DEBUG"] = True
# Upload folder
UPLOAD_FOLDER = 'static/files'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
# Database
mydb = mysql.connector.connect(
host="localhost",
user="root",
password="",
database="csvdata"
)
mycursor = mydb.cursor()
mycursor.execute("SHOW DATABASES")
# View All Database
for x in mycursor:
print(x)
# Root URL
@app.route('/')
def index():
# Set The upload HTML template '\templates\index.html'
return render_template('index.html')
# Get the uploaded files
@app.route("/", methods=['POST'])
def uploadFiles():
# get the uploaded file
uploaded_file = request.files['file']
if uploaded_file.filename != '':
file_path = os.path.join(app.config['UPLOAD_FOLDER'], uploaded_file.filename)
# set the file path
uploaded_file.save(file_path)
parseCSV(file_path)
# save the file
return redirect(url_for('index'))
def parseCSV(filePath):
# CVS Column Names
col_names = ['first_name','last_name','address', 'street', 'state' , 'zip']
# Use Pandas to parse the CSV file
csvData = pd.read_csv(filePath,names=col_names, header=None)
# Loop through the Rows
for i,row in csvData.iterrows():
sql = "INSERT INTO addresses (first_name, last_name, address, street, state, zip) VALUES (%s, %s, %s, %s, %s, %s)"
value = (row['first_name'],row['last_name'],row['address'],row['street'],row['state'],str(row['zip']))
mycursor.execute(sql, value, if_exists="append")
mydb.commit()
print(i,row['first_name'],row['last_name'],row['address'],row['street'],row['state'],row['zip'])
if (__name__ == "__main__"):
app.run(port = 5000)
Si te gusta este tutorial rápido, compártelo y si tienes algún comentario, háznoslo saber.
Recursos
Foto de Hitesh Choudhary en Unsplash
Etiquetas
Tutorial de Flask Python CSV ¿Cómo?