csv.reader只读一行

时间:2012-11-19 18:06:51

标签: python csv window line sliding

我对python很新。我正在尝试处理非常大的.csv文件(约680万行)的数据。这些行的示例如下:

Group1.1    57645   0.0954454545 
Group1.1    57662   0.09556544778
Group1.13   500 0.357114538 
Group1.13   504 0.320618298 
Group1.13   2370    0.483851368 
Group1.14   42  0.5495688

第一列给出组,第二列给出位置,第三列给出我正在读取的值以运行计算。我试图在基于位置的“滑动窗口”中执行这些计算。另一个因素是每个组彼此分开计算,因为每个组的位置编号重新开始。在我的代码中,我首先尝试在我执行任何操作之前读取组ID作为列表,“unqifying”该列表,然后使用该列表作为仅对该特定组执行“滑动窗口”的基础。然后,我转到唯一列表中的下一个组ID,然后再次运行计算。以下是我的代码的基础知识(unique1函数是一种简单的方法来统一列表:

for row in reader:
    scaffolds.append(row[0])
    unique1(scaffolds)
    newfile.seek(0)
    reader=csv.reader((line.replace('\0','') for line in newfile), delimiter="\t")
    if row[0] == unique_scaffolds[i]:
        #...perform the calculations
    else:
        i+=1

我遇到的问题是它只是在我的数据集的第一行读取而已。因此,如果我在“for reader in reader”之后插入一个“打印行”,我得到一个这样的输出:

['Group1.1', '424', '0.082048032']

如果我编写完全相同的代码而没有任何进一步的计算和循环,它将打印数据集中的每一行。在这种情况下,我将如何读取此循环开始时的每一行?

提前感谢任何建议或意见。如果我不够清楚,请告诉我,我可以尝试进一步解释。谢谢!

3 个答案:

答案 0 :(得分:1)

您每次都在重新初始化阅读器。基本上这会导致它卡在第一行。试试这个

reader=csv.reader((line.replace('\0','') for line in newfile), delimiter="\t")
for row in reader:
    scaffolds.append(row[0])
    unique1(scaffolds)
    newfile.seek(0)

    if row[0] == unique_scaffolds[i]:
        #...perform the calculations
    else:
        i+=1

答案 1 :(得分:0)

在我看来,你正在替换循环中的读者对象。修复(或摆脱它),你可能会有更好的运气。

答案 2 :(得分:0)

意识到cvsreader一次只能读取一行。您必须通过一次读入一行来生成自己的列表。