Foros Python

Versión completa: Error al importar txt en access usando python
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola, estoy intentando hacer un código para importar ficheros txt, csv, excel, etc en access usando python. Siempre me sale el mismo error:

pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][Controlador ODBC Microsoft Access] Error de sintaxis en la definición del campo. (-3553) (SQLExecDirectW)')

Estoy intentando importar un txt con 3 columnas (Fecha, Cantidad, Descripción) a modo ejemplo, pero no consigo saber qué estoy haciendo mal en la query.

Este es el código. Alguna idea?
Gracias!

Código:
import pyodbc

#Conexión a la base de datos
conn_str = (
    r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};'
    r'DBQ=C:\Users\miusuario\Documents\Access_importar\IMPORTA_TXT.accdb;'
)
cnxn = pyodbc.connect(conn_str)

#Abro el fichero txt y leo el contenido
with open('C:\\Users\miusuario\Documents\Access_importar/Datos.txt', 'r') as txt_file:
    lines = txt_file.readlines()

    #Leo el nombre de las columnas en la primera línea
    column_names = lines[0].strip().split(',')

   
    cursor = cnxn.cursor()

    #SQL query para crear una nueva tabla en access
    table_name = 'NUEVATABLA'
    columns = ', '.join([f'[{col}] TEXT' for col in column_names])
    query = f'CREATE TABLE {table_name} ({columns})'

    #Ejecuto la query
    cursor.execute(query)

    #inserto los datos en la nueva tabla
    query = f'INSERT INTO {table_name} VALUES ({",".join(["?"]*len(column_names))})'

    for line in lines[1:]:
        row = line.strip().split(',')
        cursor.execute(query, row)

    cnxn.commit()
    cursor.close()
    cnxn.close()
Hola, ¿cuál es exactamente la línea que arroja el error?
(10-04-2023, 10:17 AM)Francisco escribió: [ -> ]Hola, ¿cuál es exactamente la línea que arroja el error?

Hola! gracias! el error es justo aquí: 

 cursor.execute(query)

da igual si intento importar un csv, txt, excel... me sale siempre el mismo error. 
Hola, Jesús.

Creo que los corchetes dentro de la cadena están de más en esta línea:

Código:
columns = ', '.join([f'[{col}] TEXT' for col in column_names])

Pues te va a generar algo como esto:

Código:
CREATE TABLE NUEVATABLA ([col1] TEXT, [col2] TEXT, [col3] TEXT)

Debería ser:

Código:
columns = ', '.join([f'{col} TEXT' for col in column_names])

Eso debería solucionar al menos el error de sintaxis.

Saludos!
(10-04-2023, 01:06 PM)Francisco escribió: [ -> ]Hola, Jesús.

Creo que los corchetes dentro de la cadena están de más en esta línea:

Código:
columns = ', '.join([f'[{col}] TEXT' for col in column_names])

Pues te va a generar algo como esto:

Código:
CREATE TABLE NUEVATABLA ([col1] TEXT, [col2] TEXT, [col3] TEXT)

Debería ser:

Código:
columns = ', '.join([f'{col} TEXT' for col in column_names])

Eso debería solucionar al menos el error de sintaxis.

Saludos!

Buenas, Francisco. Lo he dejado así, pero me sigue saliendo el mismo error de sintaxis en la definición del campo en esta línea:  cursor.execute(query) Estoy probando con un fichero txt de 3 columnas (las 3 con datos tipo texto), por probar para aprender. 
Código:
import pyodbc
#Conexión a la base de datos
conn_str = (
    r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};'
    r'DBQ=C:\\Users\miusuario\Documents\Access_importar\IMPORTA_TXT.accdb;'
)
cnxn = pyodbc.connect(conn_str)
#Abro el fichero txt y leo el contenido
with open('C:\\Users\miusuario\Documents\Access_importar/ejemplo.txt', 'r') as txt_file:
    lines = txt_file.readlines()
    #Leo el nombre de las columnas en la primera línea
    column_names = lines[0].strip().split(',')
   
    cursor = cnxn.cursor()
    #SQL query para crear una nueva tabla en access
    table_name = 'NUEVATABLA'
    columns = ', '.join([f'{col} TEXT' for col in column_names])
    query = f'CREATE TABLE {table_name} ({columns})'
    #Ejecuto la query
    cursor.execute(query)
    #inserto los datos en la nueva tabla
    query = f'INSERT INTO {table_name} VALUES ({",".join(["?"]*len(column_names))})'
    for line in lines[1:]:
        row = line.strip().split(',')
        cursor.execute(query, row)
   
    cnxn.commit()
    cursor.close()
    cnxn.close()
Hola, Jesús.

Antes de esta línea:

Código:
cursor.execute(query)

Poné un print para saber cuál es exactamente la consulta que se acaba por ejecutar:

Código:
print(query)

Así se verá más claro si hay un error en la consulta.

Saludos
(11-04-2023, 01:51 PM)Francisco escribió: [ -> ]Hola, Jesús.

Antes de esta línea:

Código:
cursor.execute(query)

Poné un print para saber cuál es exactamente la consulta que se acaba por ejecutar:

Código:
print(query)

Así se verá más claro si hay un error en la consulta.

Saludos

Buenas, gracias... me sale esto:

CREATE TABLE NUEVATABLA (ÿþcampo1      campo2  campo3 TEXT)
Traceback (most recent call last):
  File "c:\Users\miusuario\Documents\Access_importar\importa.py", line 32, in <module>
    cursor.execute(query)
pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][Controlador ODBC Microsoft Access] Error de sintaxis en la definición del campo. (-3553) (SQLExecDirectW)')
Bueno, ahí está el problema:

Código:
CREATE TABLE NUEVATABLA (ÿþcampo1      campo2  campo3 TEXT)

Se ve que no estás leyendo correctamente el archivo de texto donde están los nombres de las columnas. ¿Podrías pegar el contenido de ese archivo también?

Saludos
Buenas, el fichero es muy simple. Un ejemplo de cara a tratar de importar en el futuro tablas grandes en txt, csv, etc. Lo intenté modificar yo, pero ahora dice error de sintaxis en la definición del campo.

campo1;campo2;campo3
eeee;eeee;eeeee
eeee;eeee;eeee
Hola, Jesús.

¿El split() no lo deberías hacer en el punto y coma, en lugar de la coma? Por otro lado, asegurate de abrir el archivo con la codificación correspondiente. Probablemente quieras leerlo como UTF-8, que es la codificación más común (también podés chequearlo abriendo el archivo con VS Code):

Código:
open("archivo.txt", "r", encoding="utf8")

Saludos