2016-06-22 22 views
1

現在、ファイルをcsvからxlsxに変換しています。問題は、データがすべてデフォルトですべて文字列に変換されることです。どのように数字を変換することができますか(通常、+ 1.50000000000E + 009または "+ 1.50000000000E + 009"(先頭のスペース)を文字列から数字表現に変換できます)タイプキャスティングおよび一般的な回避策を試しましたが、何も動作しません。 CSVファイルは、ヘッダを持っているので文である "IF"。Python;科学記号表記の文字列番号

def csv_to_excel(csv_path, delimiter, delimiter_txt, excel_path, excel_title): 
csv_file = open(csv_path, 'r') 
csv.register_dialect(delimiter_txt, delimiter=delimiter) 

reader = csv.reader(csv_file, dialect=delimiter_txt) 

wb = Workbook() 

ws = wb.worksheets[0] 
ws.title = excel_title 
for row_index, row in enumerate(reader): 
    for column_index, cell in enumerate(row): 
     column_letter = get_column_letter((column_index + 1)) 
     if row_index > 3: 
      ws.cell('%s%s'%(column_letter, (row_index + 1))).value = float(cell) 
     else: 
      ws.cell('%s%s'%(column_letter, (row_index + 1))).value = cell 
     print(cell) 
     print(type(cell)) 
wb.save(filename = excel_path) 
csv_file.close() 

csv_to_excel( 'file.csvになり'、 ''、 'カンマ'、 'file.xlsx'、 'データ')

ありがとうございました!どんな助けも素晴らしいでしょう!

+0

を返す 'フロート( '+ 1.50000000000E + 009')'すでに現在の答えが示唆されているものである 'フロート(セル)を'使用しているように見えます –

+0

に動作します。それはどうしたらうまくいかないのですか? –

+0

答えが示唆しているように、型キャスティングが機能するはずです。あなたの2番目の 'ws.cell = ...'は最初のものと同じように型キャスト操作をしていないのでしょうか? – MadisonCooper

答えて

1

float()

>>> float("+1.50000000000E+009") 
>>> 1500000000.0 
0

あなたはfloat()を使用する必要があります。

float("+1.50000000000E+009") 

また、あなたはあなたができるでしょう入力の特定のタイプのために知っていない場合しかし、これは潜在的に危険可能性があり、eval()を使用することができますパラメータとして渡します。

eval("+1.50000000000E+009") 

の両方が1500000000.0

+1

数値であることがわかっている場合は、信頼できない潜在的なソースからの入力を受け入れているので、 'eval()'を使うことをお勧めします。 'float()'が同じように機能するので、このケースでは任意の実行脆弱性のリスクはそれほど価値がないようです。 – arewm

+0

@arewm 'eval()はPythonの式を評価するので、私は答えを更新します。 – ospahiu

+0

'float()'が行く方法です。 'eval()'はコードの挿入に対して脆弱です。とにかく 'float()'を使うのが好きです。 – Alexander

関連する問題