繁体   English   中英

python:xlrd / csv-xlrd / csv包将对象读入内存时的空单元格处理

[英]python: xlrd/csv - empty cell treatment when xlrd/csv packages read objects into memory

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

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

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

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

问题是我不拥有数据,也无法控制其质量。 我可以想象这将是一种普遍现象,因为许多应用程序都在使用由其他来源生成的文件/数据。

如果我有办法更改默认处理方式,那将是一个明智的选择。

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

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

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

总体而言,xlrd为我们工作了,但是我对该项目的活动印象深刻。 好像我使用的是很少维护的库。

您可以使用以下代码在实际读入数据之前将要读取的工作表中所有空单元格的值更改为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

xlrd会告诉您您拥有哪种类型的单元格(空或空白,文本,数字,日期,错误)。

xlrd文档中xlrd介绍。 查看Cell类和Sheet类的以下方法:cell_type,col_types和row_types。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM