python - csv 模块将时间写入十进制

标签 python excel csv xlrd

我遇到了一个问题,我在 .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。然后添加一个 * 使传递成为位置参数。

最佳答案

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

根据xlrd docs Excel 工作表中的日期一团糟

Dates in Excel spreadsheets

In reality, there are no such things. What you have are floating point numbers and pious hope. There are several problems with Excel dates:

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

您应该能够使用 xlrd.xldate_as_tuple(xldate, datemode) ( link ) 将 float 转换为 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:]) )
    ...

关于python - csv 模块将时间写入十进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13363989/

相关文章:

python - 带有指针结构的 SWIG 函数

python - 如何从文件中绘制多条垂直线?

.net - VB.Net - Excel COM 对象未发布

excel - 在 Excel 2016 中打开 CSV 文件

arrays - Powershell - 将 CSV 文件加载到多维数组中

python - 对 Zoho Creator 返回的数据使用 json.loads() - extra_data() 错误

vba - 用逗号作为分隔符分割字符串

Excel工作表中列中字符串模式匹配的VBA代码

java - 如何将 JTextArea 的完整数据保存到 csv 文件的单个单元格中

java - 泛美卫生组织客户限制?