2017-03-06 17 views
1

多くの研究の結果、私のコードでこのエラーが表示される理由を理解できません。Python - TypeError:文字列またはバイトオブジェクトを期待しています

Pandas DataframeをOracleテーブルにエクスポートしようとしています。私はこの数百回も他のデータテーブルでも成功しましたが、このエラーは引き続き発生します。

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 
ここ

は、私がpd.read_excelで読み込み、簡単なdf['column_name'] = variableコマンドで自分の列の3を付加し、私のデータフレームであり、

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秒のロットからかもしれないと思ったので、私は0のでそれらを置き換え、それはまだ失敗します。

2)私は、エラーが何も貴重な情報を保有していない最初のカップルの行をエクスポートしようとしているからかもしれないと思ったので、私はdf = df.ix[1:]で最初の行を削除したが、それはまだ失敗。

3)私もそれが原因で私のemail_year/month/day列の値を失敗すると考えていたので、私は私のデータフレームにそれらを置く前に、文字列にそれらをすべて変更しましたが、それはまだ失敗。

4) Iはtupleの代わりstrexported_dataコマンドを変更しようとしただけcx_Oracle.DatabaseError: ORA-01036: illegal variable name/numberにエラーを変更したこと。また、他のデータフレームをエクスポートするときは、常にtupleとして正常に機能しています。

5)私はそれがいずれかのエラーの原因ではないエラーが私のOracle列が数字や文字のいずれかを許可していないからかもしれないと思ったが、それらはすべて、すべてのVarChar2に設定されています。

私はこれを解決する助けに感謝しました。

+1

質問に完全なエラートレースバックを追加してください! –

+0

すべて追加しました – theprowler

+0

実行可能なスタンドアロンのテストケースを作成できますか?問題はおそらく型の変更によるものです。特定の列については、1つの行は文字列であってもよく、次の行については整数であってもよい。それがそのエラーが発生する理由の1つです。 –

答えて

2

上記のエクスポートデータに基づいて、発生している問題は、ある行のデータが後続の行のデータと同じ種類ではないためです。あなたの場合、ある行に'04/02/13 '(文字列として)の値があり、次の行には値0(整数として)があります。データ型がすべての行の列に対して一貫していることを確認する必要があります。

+0

データフレームのすべてのデータ型を同じものに変更するには? – theprowler

+0

データフレームを作成して文字列に変換することができました。しかし、指してトンに感謝何が間違っていたのか、今私は大量のデータをエクスポートすることができます – theprowler

+0

あなたは大歓迎です。あなたはそれを考え出してうれしい! –

関連する問題