经过大量研究,我无法弄清楚为什么我的代码会收到此错误。
我正在尝试将Pandas Dataframe导出到我的Oracle表中。我已经在其他数据表上成功完成了数百次,但是这一直在产生错误。
这是我的数据框,我阅读了该数据框,pd.read_excel并用简单的df['column_name'] = variable命令附加了自己的三列:
pd.read_excel
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
我的代码在导出行失败,cursor.executemany(sql_query, exported_data)并显示以下错误:
cursor.executemany(sql_query, exported_data)
Traceback (most recent call last): File "Z:\Code\successful_excel_pdf_code.py", line 74, in <module> cursor.executemany(sql_query, exported_data) TypeError: expecting string or bytes object
这是我的相关代码:
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()
这是的打印输出exported_data:
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) 我认为错误可能是由于很多NaNs散布在整个Dataframe中,所以我将其替换为0,但仍然失败。
NaN
2) 然后,我认为错误可能是由于尝试导出不包含任何有价值信息的前几行,因此我删除了第一行,df = df.ix[1:]但仍然失败。
df = df.ix[1:]
3) 我也认为由于email_year/month/day列中的值可能会失败,因此在将它们放入Dataframe之前将它们全部更改为字符串,但仍然失败。
email_year/month/day
4) 我尝试将exported_data命令更改为astr而不是a,tuple但这仅将错误更改为cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number。另外,tuple在导出其他数据框时,它始终可以正常工作。
str
tuple
cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number
5) 我认为错误可能出在我的Oracle列中,不允许数字或字母,但它们都设置为全部,VarChar2因此也不是导致错误的原因。
VarChar2
感谢您为解决此问题所提供的帮助,谢谢。
根据上述导出数据,您遇到的问题是由于以下事实:一行中的数据与后续行中的数据类型不同。在您的情况下,一行中的值为“ 04/02/13”(作为字符串),而下一行中的值为0(作为整数)。您将需要确保所有行中列的数据类型都是一致的。