Python – TypeError: esperando un objeto de cadena o bytes

Después de mucha investigación, no puedo entender por qué recibo este error en mi código.

Estoy tratando de exportar un Pandas Dataframe a mi tabla de Oracle. He hecho esto cientos de veces con éxito en otras tablas de datos, pero esta sigue produciendo errores.

Aquí está mi Dataframe, que leí con pd.read_excel y pd.read_excel tres de mis propias columnas con simples comandos df['column_name'] = variable :

 S USTAINABLE H ARVEST S ECTOR| QUOTA LISTING APRIL 16 2013 Unnamed: 1 \ 1 DATE TRADE ID 2 04/02/13 130014 3 0 0 4 0 0 5 0 0 6 FY13 QUOTA – TO BUY 0 7 DATE TRADE ID 8 3/26/13 130006 9 4/9/13 130012 10 3/26/13 130007 11 3/26/13 130001 12 3/26/13 130009 13 4/9/13 130013 14 3/26/13 130010 15 3/26/13 130008 16 3/26/13 130011 17 1 0 Unnamed: 2 Unnamed: 3 Unnamed: 4 email_year \ 1 AVAILABLE STOCK AMOUNT BUY PRICE 2013 2 WINTER SNE 12000 TRADE IN RETURN FOR 2013 3 0 0 HADDOCK GOM, 2013 4 0 0 YELLOWTAIL GOM, OR 2013 5 0 0 WITCH - OFFERS 2013 6 0 0 0 2013 7 DESIRED STOCK AMOUNT BUY PRICE 2013 8 COD GBE ANY OFFERS 2013 9 COD GBW UP TO 100,000 0.3 2013 10 COD GBW ANY OFFERS 2013 11 COD GOM INQUIRE 1.5 2013 12 WINTER GB ANY OFFERS 2013 13 WINTER SNE UP TO 100,000 0.3 2013 14 WINTER SNE ANY OFFERS 2013 15 YELLOWTAIL GB ANY OFFERS 2013 16 YELLOWTAIL GOM ANY TRADE FOR GB STOCKS -\nOFFERS 2013 17 0 0 0 2013 email_month email_day 1 4 16 2 4 16 3 4 16 4 4 16 5 4 16 6 4 16 7 4 16 8 4 16 9 4 16 10 4 16 11 4 16 12 4 16 13 4 16 14 4 16 15 4 16 16 4 16 17 4 16 

Mi código falla en la línea de exportación cursor.executemany(sql_query, exported_data) con el error:

 Traceback (most recent call last): File "Z:\Code\successful_excel_pdf_code.py", line 74, in  cursor.executemany(sql_query, exported_data) TypeError: expecting string or bytes object 

Aquí está mi código relevante:

 df = pd.read_excel(file_path) df = df.fillna(0) df = df.ix[1:] cursor = con.cursor() exported_data = [tuple(x) for x in df.values] #exported_data = [str(x) for x in df.values] #print("exported_data:", exported_data) sql_query = ("INSERT INTO FISHTABLE(date_posted, stock_id, species, pounds, advertised_price, email_year, email_month, email_day, sector_name, ask)" "VALUES(:1, :2, :3, :4, :5, :6, :7, :8, 'Sustainable Harvest Sector', '1')") cursor.executemany(sql_query, exported_data) con.commit() #commit to database cursor.close() con.close() 

Aquí hay una copia impresa de exported_data :

[('DATE', 'TRADE ID', 'AVAILABLE STOCK', 'AMOUNT', 'BUY PRICE', '2013', '4', '16'), ('04/02/13', 130014, 'WINTER SNE', 12000, 'TRADE IN RETURN FOR', '2013', '4', '16'), (0, 0, 0, 0, 'HADDOCK GOM,', '2013', '4', '16'), (0, 0, 0, 0, 'YELLOWTAIL GOM, OR', '2013', '4', '16'), (0, 0, 0, 0, 'WITCH - OFFERS', '2013', '4', '16'), ('FY13 QUOTA – TO BUY', 0, 0, 0, 0, '2013', '4', '16'), ('DATE', 'TRADE ID', 'DESIRED STOCK', 'AMOUNT', 'BUY PRICE', '2013', '4', '16'), ('3/26/13', 130006, 'COD GBE', 'ANY', 'OFFERS', '2013', '4', '16'), ('4/9/13', 130012, 'COD GBW', 'UP TO 100,000', 0.3, '2013', '4', '16'), ('3/26/13', 130007, 'COD GBW', 'ANY', 'OFFERS', '2013', '4', '16'), ('3/26/13', 130001, 'COD GOM', 'INQUIRE', 1.5, '2013', '4', '16'), ('3/26/13', 130009, 'WINTER GB', 'ANY', 'OFFERS', '2013', '4', '16'), ('4/9/13', 130013, 'WINTER SNE', 'UP TO 100,000', 0.3, '2013', '4', '16'), ('3/26/13', 130010, 'WINTER SNE', 'ANY', 'OFFERS', '2013', '4', '16'), ('3/26/13', 130008, 'YELLOWTAIL GB', 'ANY', 'OFFERS', '2013', '4', '16'), ('3/26/13', 130011, 'YELLOWTAIL GOM', 'ANY', 'TRADE FOR GB STOCKS -\nOFFERS', '2013', '4', '16'), (1, 0, 0, 0, 0, '2013', '4', '16')]

1) Pensé que el error podría deberse a la gran cantidad de NaN se dispersaron a lo largo del Dataframe, por lo que los reemplacé con 0 y aún falla.

2) Entonces pensé que el error podría deberse a intentar exportar las primeras dos filas que no contenían información valiosa, así que df = df.ix[1:] la primera fila con df = df.ix[1:] pero aún falla.

3) También pensé que podría estar fallando debido a los valores en mis email_year/month/day , así que las cambié todas a cadenas antes de ponerlas en mi Dataframe, pero aún falla.

4) Intenté cambiar el comando cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number a una str lugar de una tuple pero eso solo cambió el error a cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number . Además, siempre ha funcionado bien como una tuple al exportar otros marcos de datos.

5) Pensé que el error podría deberse a que mis columnas de Oracle no permiten números ni letras, pero todos están configurados para todos los VarChar2 por lo que tampoco es la causa del error.

Agradecí cualquier ayuda para resolver esto, gracias.

Sobre la base de los datos de exportación mencionados anteriormente, el problema que está experimentando se debe al hecho de que los datos en una fila no son del mismo tipo que los datos en las filas posteriores. En su caso, en una fila tiene el valor ’04 / 02/13 ‘(como una cadena) y en la siguiente fila tiene el valor 0 (como un entero). Deberá asegurarse de que el tipo de datos sea consistente para la columna en todas las filas.