csv模块将时间写成十进制

我遇到了一个.xls文件中有一些数据的问题(下面的例子)。

ABCDEF John Smith 8:00AM 9:00AM 10:00AM 5:00PM 8.00 

当我使用Python CSV模块将它写入csv时,它会以

 John,Smith,0.333333333,0.375,0.416666667,0.708333333,0.333333333 

现在有趣的部分是如果我手动将xls文件保存为MSDOS csv我得到所需的输出

 John,Smith,8:00 AM,9:00 AM,10:00 AM,5:00 PM,8:00 

这是我正在运行的function。 它有点凌乱,所以我提前道歉。

 def csv_gen(filepath, saveto): for files in glob.glob("*.xls"): shutil.copy(filepath + "\\" + files, saveto) with xlrd.open_workbook(files) as wb: sh = wb.sheet_by_index(0) newfile = saveto + files[:-4] + '.csv' now = datetime.datetime.now() dates = now.strftime("%m-%d-%Y") filestart = [saveto + files] time = [dates] with open(newfile, 'wb') as f: c = csv.writer(f,delimiter=',') list = range(sh.nrows) last = range(sh.nrows)[-1] list.remove(0) list.remove(3) list.remove(2) list.remove(1) list.remove(last) #Iterate through data and show values of the rows for r in list: lines = sh.row_values(r) del lines[:4] stuff = lines + filestart + time #Remove blanks so csv doesnt have uneeded data if lines[0] is '': del stuff[:] #Write to csv file with new data if any(field.strip() for field in stuff): c.writerow(stuff) shutil.move(newfile, mergeloc) 

我不明白为什么这样出来。 我已经尝试将方言标志添加到csv作家是“excel”,但输出仍然是相同的。

更新:

如果我将文档另存为csv,如下所示: workBook.SaveAs(test.csv, 24)编码24用于MSDOS。 我得到所需的输出

 John,Smith,8:00 AM,9:00 AM,10:00 AM,5:00 PM,8:00 

但是,当csv模块抓住它,并删除一些空行,并删除了一些东西在最后它写出行,这是当我再次得到小数

 John,Smith,0.333333333,0.375,0.416666667,0.708333333,0.333333333 

csv模块的目的是修改行和删除空行。

更新

  for r in list: cells = sh.row_values(r) csv_row = cells[0] for col_value in cells[1:]: csv_row.append(datetime.time(*xlrd.xldate_as_tuple(col_value, 0)[3:])) 

添加row_values只是返回单元格的值而不是xldata:0.33333。 然后添加一个*使传递一个位置参数。

这在csv模块中看起来不是一个问题,看起来像读取.xls文件时出错了。

根据xlrd 文档 Excel工作表中的date是一个非常糟糕的混乱

Excel电子表格中的date

事实上,没有这样的事情。 你有什么浮点数和虔诚的希望。 Exceldate有几个问题:

我用一个新的.xls文件用你在那里提供的内容做了一个快速testing。 Python读取文件没有问题,虽然我的机器上没有Excel,但是我在LibreOffice中创build了文件并将其保存为.xls。 即使如此,这些字段也是python方面的unicodestring。

您应该能够使用xlrd.xldate_as_tuple(xldate, datemode) ( 链接 )将float转换为pythondate元组。 干

 print xlrd.xldate_as_tuple(0.333333333,0) 

打印出来

 (0, 0, 0, 8, 0, 0) 

UPDATE

所以你可能想要类似下面的东西,改变你的行的循环

 ... for r_idx in list: cells = sh.row(r) csv_row = [cells[0]] # the first row value should be ok as just a string for col_value in cells[1:]: # add the date time column values to the converted csv row csv_row.append( datetime.time(xlrd.xldate_as_tuple(col_value, 0)[3:]) ) ...