2

是否可以选择更改 csv 和 xlrd 包处理空单元格的默认方式?默认情况下,空单元格被分配一个空字符串值 = ''。当使用数据库时,这是有问题的,因为空字符串不是 None 值,许多与数据库接口的 python 包(例如 SQLAlchemy)可以将其作为Null处理以供数据库使用。

例如,如果在假定为小数/整数/浮点数/双精度的字段中出现空单元格,则数据库将抛出异常,因为对十进制/整数/浮点类型的字段进行了字符串插入/双倍的。

我还没有找到任何示例或文档来说明我如何做到这一点。我目前的方法是检查数据并执行以下操作:

if item[i] == '': 
   item[i] = None

这样做的问题是我不拥有数据并且无法控制其质量。我可以想象这将是一种常见的情况,因为许多应用程序使用的文件/数据是由它们以外的来源生成的。

如果有办法改变默认处理,那么我认为这将是一个明智的方法。

4

3 回答 3

1

我有和你一样的设置(ORM 的 sqlalchemy,以及我几乎无法控制的数据,通过 excel 文件提供)。我发现我需要先整理 xlrd 中的数据,然后再将其转储到数据库中。我不知道您可以对 xlrd 模块进行任何调整。

更笼统地说:最好尝试获取尽可能多的示例 excel 文件样本,看看您的应用程序是否可以处理它。我发现偶尔会出现奇怪的字符通过 excel(人们从不同语言复制粘贴),这会导致进一步崩溃。还发现在某些情况下文件格式不是 UTF-8 而是 iso-8859 或其他格式。我最终使用 iconv 来转换文件。

您可能还想看看这篇stackoverflow 文章

总体而言,xlrd 为我们工作,但我对围绕该项目的活动印象不深。好像我正在使用一个几乎没有维护的库。

于 2013-03-28T06:17:44.773 回答
0

在实际读取数据之前,您可以使用以下代码将正在读取的工作表中所有空单元格的值更改为 NULL(或 None,或任何您喜欢的)。它遍历所有行和列并检查 cell_type 是否为 EMPTY,然后将相应单元格的值更改为“NULL”。

import xlrd

book = xlrd.open_workbook("data.xlsx")
sheet_name = book.sheet_names()[0] #getting the sheetname of the  first sheet
sheet = book.sheet_by_name(sheet_name)

for r in range(0,sheet.nrows): #create a list with all row numbers that contain data and loop through it
    for s in range(0, sheet.ncols):       #create a list with all column numbers that contain data and loop through i
        if sheet.cell_type(r, c) == xlrd.XL_CELL_EMPTY:
            sheet._cell_values[r][c] = 'NULL'

然后您可以读取数据(例如从第一列),如果单元格之前为空,您将获得 NULL 作为值:

for r in range(0,sheet.nrows):
    data_column_1 = sheet.cell(r,0).value
于 2015-01-20T19:31:47.513 回答
-1

xlrd会告诉你你有什么类型的单元格(空或空白、文本、数字、日期、错误)。

这在xlrd文档中有所介绍。查看 Cell 类,以及 Sheet 类的这些方法:cell_type、col_types 和 row_types。

csv格式无法表达“根本没有数据”和“值是零长度字符串”之间的区别。您仍然需要检查''并采取相应措施。

于 2013-03-29T11:30:08.217 回答