3

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

  A            B           C         D         E        F
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

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

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。然后添加一个 * 以使传递成为位置参数。

4

1 回答 1

2

对我来说,这在csv模块中看起来不是问题,看起来在读取.xls文件时出现了问题。

根据xlrd 文档,Excel 工作表中的日期是一团糟

Excel 电子表格中的日期

实际上,没有这样的事情。你所拥有的是浮点数和虔诚的希望。Excel日期有几个问题:

我使用.xls您在其中提供的内容的新文件进行了快速测试。Python 读取文件没有问题,虽然我的机器上没有 Excel,但我在 LibreOffice 中制作了文件并将其保存为 .xls。即便如此,这些字段在 python 端以 unicode 字符串的形式出现。

您应该能够使用xlrd.xldate_as_tuple(xldate, datemode)( link ) 将浮点数转换为 python 日期元组。正在做

print xlrd.xldate_as_tuple(0.333333333,0)

打印出来

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

更新

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

...
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:]) )
    ...
于 2012-11-13T16:14:46.533 回答