是否可以选择更改csv和xlrd包处理空单元格的默认方式?默认情况下,为空单元格分配一个空字符串值=''。当使用数据库时,这是有问题的,因为空字符串不是None值,许多与数据库接口的python包(例如SQLAlchemy)可以作为 Null 处理数据库消耗。
例如,如果假设为十进制/整数/浮点数/双精度的字段中出现空单元格,则数据库将引发异常,因为字符串的插入是对十进制/整数类型的字段进行的/浮动/双
我没有找到任何示例或文档来说明我如何做到这一点。我目前的方法是检查数据并执行以下操作:
if item[i] == '':
item[i] = None
这个问题是我不拥有数据并且无法控制其质量。我可以想象这很常见,因为许多应用程序使用的是由其他来源生成的文件/数据。
如果有办法改变默认治疗,那么在我看来这是一种明智的做法。
答案 0 :(得分:1)
我有与你自己相同的设置(对于ORM,sqlalchemy,以及我无法控制的数据,通过excel文件提供的数据)。我发现在将数据转储到数据库之前需要从xlrd中提取数据。我不知道你可以在xlrd模块上应用任何调整。
更一般地说: 最好尽可能尝试获取尽可能大的示例excel文件示例,看看您的应用程序是否可以应对它。我发现有时奇怪的角色通过excel(人们从不同语言复制粘贴)使其进一步下降。还发现在某些情况下文件格式不是UTF-8,而是iso-8859或其他。我最终使用iconv来转换文件。
您可能还想查看此stackoverflow article
整体而言xlrd对我们有用,但我对项目周围的活动印象不深。好像我正在使用几乎没有维护的库。
答案 1 :(得分:0)
在实际读入数据之前,您可以使用以下代码将正在读取的工作表中的所有空单元格的值更改为NULL(或无,或任何您喜欢的)。它循环遍历所有行和列,并检查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
答案 2 :(得分:-1)
xlrd
将告诉您您的单元格类型(空或空白,文本,数字,日期,错误)。
xlrd
文档中对此进行了介绍。查看Cell类,以及Sheet类的这些方法:cell_type,col_types和row_types。
csv
格式无法表达“根本没有数据”和“值是零长度字符串”之间的区别。您仍需要检查''
并采取相应措施。