我有一个csv文件,我想将其转换为数值数据集。为此,我阅读文件的每一行并应用一个保存我想要的功能并将其打印在另一个csv文件中。
我还想做的是计算我读过的行数(原始数据集中的行数)和发生的错误数(原始数据集有一些错误,我的函数会引发错误)
问题:使用下面的代码(见下文)只返回确切行数的一半。实际上,当我在一个只有1 000 000行的文件上使用它时,nb_lines只有500 000.而且由于我想要记录那些不是" good"的行,我想我必须记录错误行:/
data=csv.reader(open(path1,"rb"),delimiter=';',skipinitialspace=True)
output=csv.writer(open(path2,"wb"))
error=csv.writer(open(path3,"wb"))
nb_error=0
nb_lines=0
for row in data:
nb_lines=nbr_lines+1
try:
liste=data.next()
toprint=function(liste)
output.writerow(aprinter)
except Exception as e:
nb_error=nb_error+1
badline=[nb_lines,e]
error.writerow(badline)
我的循环有什么问题? 在此先感谢:)
答案 0 :(得分:0)
由于某种原因,你在循环中递增迭代器。 for row in data
每次都会使row
成为下一行。但是你做liste=data.next()
- 所以你再次增加。这意味着你跳过了其他每一行:不仅仅是你的计数器错了,而且实际上你错过了一半的数据。
您应该删除该行,并在循环中引用row
而不是liste
。
答案 1 :(得分:0)
每次执行此liste = data.next()
时都会跳过一行。我也改变了增量,在python中它缩短为+=
。
data = csv.reader(open(path1,"rb"),delimiter=';',skipinitialspace=True)
output = csv.writer(open(path2,"wb"))
error = csv.writer(open(path3,"wb"))
nb_error = 0
nb_lines = 0
for row in data:
nb_lines +=1
try:
toprint = function(row)
output.writerow(aprinter)
except Exception as e:
nb_error += 1
badline = [nb_lines,e]
errors.writerow(badline)
您还可以将更改nb_lines
的行存储到row
,因此可能更容易找到错误。
答案 2 :(得分:0)
这已经得到了解答,但您可以使用以下方法简化代码:
csvreader.line_num - 从源迭代器读取的行数。 这与记录可以返回的记录数不同 跨越多行。
将来如果你需要迭代和计数,你应该考虑使用python的enumerate函数。以下是文档中的示例代码:
>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
更少的代码==更少的错误,一般来说:D