2017-03-06 65 views
1

經過大量研究,我無法弄清楚爲什麼我在代碼中收到此錯誤。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

你能創建一個可以運行的獨立測試用例嗎?問題可能是由於改變類型。對於特定列,一行可能是一個字符串,下一行可能是一個整數。這是造成這種錯誤的一個原因。 –

回答

2

根據上面提到的導出數據,您遇到的問題是由於一行中的數據與後續行中的數據不同。在你的情況下,在一行中你的值爲'04/02/13'(作爲一個字符串),在下一行中你的值爲0(作爲一個整數)。您需要確保數據類型對於所有行的列是一致的。

+0

哦,好的,這樣做有足夠的道理......是否有簡單的方法是將數據框的所有數據類型更改爲同一個數據類型? – theprowler

+0

因此我想出了它,並能夠將所有值更改爲字符串。誰知道爲什麼創建數據框會創建一些值字符串和其他整數。但是非常感謝你指點出了什麼問題,現在我可以繼續出口大量的數據 – theprowler

+0

不客氣。很高興你明白了! –

相關問題