我正在使用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
值的行。然而,这似乎是一个有点抽象的解决方案,会减慢程序,因此我寻找一个不同的解决方案。
答案 0 :(得分:1)
我没有像标题所示那样从列中提取下一个值,而是发现更容易跳过包含任何null
值的行。有两种不同的方法可以做到这一点:
使用循环扫描每一行并查看它是否包含null
值,并跳转到下一行,直到找到一行不包含null
值。例如:
tempRow = next(csvFile)
for value in tempRow:
if value == '':
tempRow = next(csvFile)
else:
row = tempRow