Python - TypeError:期望字符串或字节对象

问题描述:

经过大量研究,我无法弄清楚为什么我在代码中收到此错误。Python - TypeError:期望字符串或字节对象

我试图导出熊猫数据框到我的Oracle表。我已经在其他数据表上成功完成了数百次,但是这个数据表不断产生错误。

这里是我的数据框,我与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)我的代码失败,出现错误:

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打印输出:

[('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)我认为错误可能是从大量的NaN S是分散在整个数据帧,所以我取而代之的是0和它仍然失败。

2)我当时以为该错误可能是由试图出口其未持有有价值的信息第一几排,所以我删除了第一行与df = df.ix[1:],但它仍然失败。

3)我还以为这可能是因为我的email_year/month/day列中的值来失败,所以将它们放在我的数据帧之前,我所有这些改变为字符串,但它仍然失败。

4)我试图改变exported_data命令到str代替tuple但仅改变了错误cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number。另外,在导出其他数据帧时,它始终可以很好地工作为tuple

5)我认为错误可能是从我的Oracle列不允许任何数字或字母,但它们都设置为所有VarChar2,这样是不是错误的原因要么。

我很感谢解决此问题的任何帮助,谢谢。

+1

请将完整的错误追溯添加到您的问题! –

+0

刚添加了全部 – theprowler

+0

你能创建一个可以运行的独立测试用例吗?问题可能是由于改变类型。对于特定列,一行可能是一个字符串,下一行可能是一个整数。这是造成这种错误的一个原因。 –

根据上面提到的导出数据,您遇到的问题是由于一行中的数据与后续行中的数据不同。在你的情况下,在一行中你的值为'04/02/13'(作为一个字符串),在下一行中你的值为0(作为一个整数)。您需要确保数据类型对于所有行的列是一致的。

+0

哦,好的,这样做有足够的道理......是否有简单的方法是将数据框的所有数据类型更改为同一个数据类型? – theprowler

+0

因此我想出了它,并能够将所有值更改为字符串。谁知道为什么创建数据框会创建一些值字符串和其他整数。但是非常感谢你指点出了什么问题,现在我可以继续出口大量的数据 – theprowler

+0

不客气。很高兴你明白了! –