2016-06-22 135 views
1

我目前正在将文件从csv转换为xlsx。问题是数据默认全部转换为字符串。如何将数字(通常显示为+ 1.500000000E + 009或“+ 1.50000000000E + 009”(前导空格)从字符串转换为数字表示形式)我试过类型转换和常规变通方法,但没有任何效果。 “IF” 语句是因为csv文件具有标题。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

类型转换应该可行 - 正如答案所暗示的那样。难道你的第二个'ws.cell = ...'没有像第一个那样的类型转换操作吗?你有一个'ws.cell ... = float(cell)',另一个只是'ws.cell ... = 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

相关问题