Tengo un archivo CSV y quiero importar este archivo de forma masiva a mi base de datos sqlite3 usando Python. el comando es ".importar .....". pero parece que no puede funcionar así. ¿Alguien puede darme un ejemplo de cómo hacerlo en sqlite3? Estoy usando Windows por si acaso. Gracias
106
Respuestas:
fuente
not all arguments converted during string formatting
cuando intento este método.La creación de una conexión sqlite a un archivo en el disco se deja como un ejercicio para el lector ... pero ahora hay dos líneas posibles gracias a la biblioteca de pandas
fuente
df
así que acorté su ejemplo a:pandas.read_csv(csvfile).to_sql(table_name, conn, if_exists='append', index=False)
Mis 2 centavos (más genérico):
fuente
El
.import
comando es una característica de la herramienta de línea de comandos sqlite3. Para hacerlo en Python, simplemente debe cargar los datos utilizando las instalaciones que Python tenga, como el módulo csv , e insertando los datos como de costumbre.De esta manera, también tiene control sobre qué tipos se insertan, en lugar de depender del comportamiento aparentemente indocumentado de sqlite3.
fuente
fuente
¡Muchas gracias por la respuesta de Bernie ! Tuve que modificarlo un poco, esto es lo que funcionó para mí:
Mi archivo de texto (PC.txt) se ve así:
fuente
Tiene razón, ese
.import
es el camino a seguir, pero ese es un comando del shell SQLite3.exe. Muchas de las respuestas principales a esta pregunta involucran bucles de Python nativos, pero si sus archivos son grandes (los míos son de 10 ^ 6 a 10 ^ 7 registros), desea evitar leer todo en pandas o usar un bucle / comprensión de lista de Python nativo (aunque no los cronometré para compararlos).Para archivos grandes, creo que la mejor opción es crear la tabla vacía de antemano usando
sqlite3.execute("CREATE TABLE...")
, quitar los encabezados de sus archivos CSV y luego usarsubprocess.run()
para ejecutar la declaración de importación de sqlite. Dado que la última parte es, creo, la más pertinente, comenzaré con eso.subprocess.run()
Explicación
Desde la línea de comandos, el comando que está buscando es
sqlite3 my.db -cmd ".mode csv" ".import file.csv table"
.subprocess.run()
ejecuta un proceso de línea de comandos. El argumento desubprocess.run()
es una secuencia de cadenas que se interpretan como un comando seguido de todos sus argumentos.sqlite3 my.db
abre la base de datos-cmd
flag después de que la base de datos le permite pasar múltiples comandos de seguimiento al programa sqlite. En el shell, cada comando debe estar entre comillas, pero aquí, solo deben ser su propio elemento de la secuencia.'.mode csv'
hace lo que esperabas'.import '+str(csv_file).replace('\\','\\\\')+' <table_name>'
es el comando de importación.Desafortunadamente, dado que el subproceso pasa todos los seguimientos
-cmd
como cadenas entre comillas, debe duplicar sus barras diagonales inversas si tiene una ruta de directorio de Windows.Eliminación de encabezados
No es realmente el punto principal de la pregunta, pero esto es lo que usé. Nuevamente, no quería leer todos los archivos en la memoria en ningún momento:
fuente
Basado en la solución Guy L (Me encanta) pero puede manejar campos de escape.
fuente
Puedes hacer esto usando
blaze
&odo
eficientementeOdo almacenará el archivo csv en
data.db
(base de datos sqlite) bajo el esquemadata
O lo usa
odo
directamente, sinblaze
. De cualquier manera está bien. Leer esta documentaciónfuente
Si el archivo CSV debe importarse como parte de un programa de Python, entonces, por simplicidad y eficiencia, puede usarlo
os.system
siguiendo las líneas sugeridas por lo siguiente:El punto es que al especificar el nombre de archivo de la base de datos, los datos se guardarán automáticamente, asumiendo que no hay errores al leerlos.
fuente
fuente
En aras de la simplicidad, puede utilizar la herramienta de línea de comandos sqlite3 del Makefile de su proyecto.
make test.sql3
luego crea la base de datos sqlite a partir de un archivo test.csv existente, con una única tabla "prueba". A continuación, puedemake test.dump
verificar el contenido.fuente
Descubrí que puede ser necesario dividir la transferencia de datos desde el csv a la base de datos en trozos para no quedarse sin memoria. Esto se puede hacer así:
fuente