从数据库读取时,python脚本遇到错误,数据为空

时间:2016-10-14 06:14:41

标签: python

我正在从数据库中的数据表中读取数据。当数据库中的表中没有数据时,该方法抛出异常。

def readData(table):
"""Read the database table, parse it according to the field map, and return list of parsed lines"""
cmd = GETTABLE + ' ' + table
records = []
try:
    result = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
    data = result.communicate()[0]
except subprocess.CalledProcessError, e:
    errorExit( 'Unable to read ' + table + ': ' + str(e))
if (result.returncode > 0):
    errorExit( 'Unable to read ' + table + ': ' + data)

lines = data.split('\n')
# Get rid of all the blank lines
lines = [line for line in lines if len(line)>0]
# Pop the first line of the data and use it to parse the column names into a map
header = lines.pop(0)
fieldmap = createFieldMap(header)

for line in lines:
    records.append(getFieldMap(line, fieldmap))
return records

由于表格中没有数据,因此会在第header = lines.pop(0)行引发错误。

请建议我如何优雅地处理空数据处理。

执行此脚本时会出现以下错误:

  

追踪(最近一次通话):   File" ./ dumpLineSegments",line   204,在gnrMemberMap中,gnrGroupMap =   getGenericMemberMap(' PPWR_GNR_MEM')文件" ./ dumpLineSegments",line   119,在getGenericMemberMap中为readData(tablename)中的gnrMember:File   " ./ dumpLineSegments",第78行,在readData头文件中= lines.pop(0)   IndexError:从空列表中弹出

1 个答案:

答案 0 :(得分:0)

首先,我会以保留缩进的方式编辑代码并显示错误消息。正如在smarx的评论中所给出的,你只需要检查你是否有一些东西可以留下来弹出。但是下一行也容易出错,应该处理问题。例如。如果有一条线,但它不是合法的标题,这可能会发出警告(在我的例子中)。然而,提出一些有意义的例外也是一个好主意。 但是检查除空白之外的空行也是一个好主意。然后代码的第二部分给出:

lines = data.split('\n')
# Get rid of all the blank lines, stripping whitespace. Test for
# an empty string can be done as if line
lines = [line.strip() for line in lines if line.strip()]
# Pop the first line of the data and use it to parse the column names into a map
if lines: # check if you have any lines
    header = lines.pop(0)
    try: # I guess you parse the header somehow, which can fail
         fieldmap = createFieldMap(header)
    except FieldmapError: # or whatever error is raised when the parsing of the header fails
         warning.warn('{} is not a valid header'.format(header))
         return None
    else:
        for line in lines:
            records.append(getFieldMap(line, fieldmap))
        return records
else:
    return None

如果没有数据,则会以静默方式返回None,如果标题错误则会引发警告。 但是,如果可能的话,我会使用python数据库驱动程序而不是系统调用来查询数据库。