拉出同一列标题下的下一个值

时间:2016-07-25 16:42:39

标签: python mysql python-3.x csv

我正在使用Python的csv模块来读取“.csv”文件并将它们解析为MySQL插入语句。为了维护语句的语法,我需要确定每个列标题下列出的值的类型。但是,我遇到了一个问题,因为有些行以null值开头。

如何使用csv模块返回同一列下的下一个值,直到返回的值为 null?这不必使用csv模块完成;我对所有解决方案持开放态度。查看完文档后,我不确定csv模块是否能够满足我的需求。我正在思考这些问题:

if rowValue == '':
    rowValue = nextRowValue(row)

显然next()方法只返回csv“list”中的下一个值,而不是像我想要的那样在同一列下返回下一个值,并且nextRowValue()对象不存在。我只是在展示这个想法。

编辑:只是为了添加一些上下文,这里有一个我正在做的事情以及我遇到的问题的例子。

如果表格如下:

ID Date Time  Voltage Current Watts
0  7/2  11:15         0       0
0  7/2  11:15         0       0
0  7/2  11:15  380    1       380

这是一个非常精简的代码版本,我用它来读取表格,获取列标题并确定第一行中值的类型。然后将它们放入单独的列表中,然后使用deque将它们添加到单独函数中的insert语句中。并非所有的代码都有特色,我可能会留下一些关键部分,但这里有一个例子:

import csv, os
from collections import deque

def findType(rowValue):
    if rowValue == '':
        rowValue = 
    if '.' in rowValue:
        try:
            rowValue = type(float(rowValue))
        except ValueError:
            pass
    else:
        try:
            rowValue = type(int(rowValue))
        except:
            rowValue = type(str(rowValue))
    return rowValue

def createTable():
    inputPath = 'C:/Users/user/Desktop/test_input/'
    outputPath = 'C:/Users/user/Desktop/test_output/'
    for file in os.listdir(inputPath):
        if file.endswith('.csv'):
            with open(inputPath + file) as inFile:
                with open(outputPath + file[:-4] + '.sql', 'w') as outFile:
                    csvFile = csv.reader(inFile)
                    columnHeader = next(csvFile)
                    firstRow = next(csvFile)
                    cList = deque(columnHeader)
                    rList = deque(firstRow)
                    hList = []
                    for value in firstRow:
                        valueType = findType(firstRow)
                        if valueType == str:
                            try:
                                val = '`' + cList.popleft() + 'varchar(255)'
                                hList.append(val)
                            except IndexError:
                                pass
                        etc.

从findType函数返回的其余值类型等等。问题是,当使用deque将值添加到rList时,它会跳过null个值,以便列表中列标题的项目数为6,例如,项目数量为行列表将为5,因此它们不会排列。

一个有点抽出的解决方案是扫描每一行的null值,直到找到一个使用类似的东西:

for value in firstRow:
     if value == '':
         firstRow = next(csvFile)

继续此循环,直到找到没有null值的行。然而,这似乎是一个有点抽象的解决方案,会减慢程序,因此我寻找一个不同的解决方案。

1 个答案:

答案 0 :(得分:1)

我没有像标题所示那样从列中提取下一个值,而是发现更容易跳过包含任何null值的行。有两种不同的方法可以做到这一点:

使用循环扫描每一行并查看它是否包含null值,并跳转到下一行,直到找到一行不包含null值。例如:

tempRow = next(csvFile)
for value in tempRow:
    if value == '':
       tempRow = next(csvFile)
    else:
       row = tempRow