2014-05-02 56 views
-2

我有一个csv文件,我想将其转换为数字数据集。为此,我读取文件的每一行,并应用一个保留我想要的功能,并将其打印到另一个csv文件中。计算行数(csv模块)

我还想要做的是计算我读过的行数(原始数据集中的行数)和发生的错误数(原始数据集有一些错误,我的函数将会提高错误)

问题:使用下面的代码(见下文)只返回确切行数的一半。事实上,当我在一个正好有1 000 000行的文件上使用它时,nb_lines只有500 000.而且,由于我想记录不是“好”的行,我想我必须记录错误的行:/

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) 

我的循环出了什么问题? 在此先感谢:)

+1

'nb_lines = nbr_lines + 1'你有没有在你运行代码错字? – Phlya

+0

对不起,我没有正确粘贴我的代码。我改变了它 –

回答

0

由于某种原因,您可以在循环内增加迭代器。 for row in data使得row每次都是下一行。但是你做liste=data.next() - 所以你再次增加。这意味着你跳过其他所有行:不仅仅是你的计数器是错误的,而且你实际上错过了一半的数据。

您应该删除该行,并在循环中引用row而不是liste

+0

哇,确实很大的错误。非常感谢您指出这一点!你拯救了我的生命^^ –

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_linesrow,所以可能会更容易找到错误。

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