2016-07-06 7 views
1

スプレッドシートから値を読み取るのにopenpyxlを使用しています。これらの値は浮動小数点数として読み込まれていますが、私はその理由を完全にはわかりません。浮動小数点数を小数点以下の文字列にキャストする方法

import openpyxl as opx 
wb = opx.load_workbook(SKU_WORKBOOK_PATH, use_iterators=True, data_only=True) 
ws = wb.worksheets[0] 
for row in ws.iter_rows(): 
    foo = str(int(row[1].internal_value)) 

これはエラーを投げている:

ValueError: invalid literal for int() with base 10: '6978279.0' 

通常、openpyxlはintとして整数値を読み込み、今回はそれが文字列としてキャストフロートでそれを読んでいます。スプレッドシートでは、このセルの値は6978279です。

これをfoo = str(int(float(foo)))としたい文字列に変換しています。その結果、'6978279'というようになります。私もfoo = foo[:-2]を実行することができましたが、これはintまたは小数点以下の桁で読み取られる可能性のある別のセルが問題になることを心配しています。

これは、自分が持っているものを私が望むものにマッシュする恐ろしい、面倒な方法のように感じます。これを行うもっとpythonicな方法がありますか?力が浮かぶようにxlsxを読んでいますか?トリプルキャスティングなしでどうすればいいですか?

+0

これはウェブスクレイパーの検索用語に使用されているので、文字列でなければなりません(とにかくスクリプトのその時点で)。しかし '.0'は検索を失敗させます。私はそれを他の検索用語と関連付けるときに 'int'に、次にそれを検索するときに' str'に変換することができます。私はちょうどそれがキャストのこのclunkyコンボなしで一度に3つすべてを行う方法があると思っていた。 – Will

+0

Excelファイルを読むとき、openpyxlはintに変換しようとし、小数点を持つXMLソースの何かについてはfloatに戻ります。 floatからintに簡単に変換できます。また、古いバージョンのAPIを使用していて、 'internal_value'を避けてください。 –

答えて

2

あなたは0.0のような小数を持つことはありません場合はstr.rstripそれは、他の小数の端から 6978279削除ゼロを作ることができますが、その値1.12300を変更するつもりはない1.233次のようになります。

In [20]: "1.234200".rstrip("0.") 
Out[20]: '1.2342' 

In [21]: "1.0".rstrip("0.") 
Out[21]: '1' 

あなたの場合文字列が空の場合0.0などを持つことができます..あなたはキャッチできます

In [22]: s = "0.0".rstrip("0.") or "0" 
+0

まさに私が探していたものです。私は前にパラメータで 'rstrip'を使ったことはありません。 – Will

+0

心配はありませんが、私が答えで言ったように、0または0.0のケースがありますが、他のすべての値のストリッピングと0の後ろの0は実際の値を変更しないので、0、後者のコードはそれを "0"に設定します。 "0.0" .rstrip( "0。") 'はfalseとみなされる空の文字列を返します。そうすれば、sはorに到達し、" 0 –

0

あなたはARITHためのものであってもよい(int型やfloat型を返す必要がある場合

def strip_num_or_float(value): 
    try: 
     value= int(value) 
    except TypeError: 
     value = value.normalize() 
    return value 
関連する問題