3

我对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 作为列表读取,“唯一化”该列表,然后使用该列表作为仅在该特定组上执行“滑动窗口”的基础。然后我移动到唯一列表中的下一个组 ID 并再次运行计算。这是我的代码的基础知识(uniq1 函数是唯一化列表的简单方法:

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 row in reader”之后插入一个“打印行”,我会得到如下输出:

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

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

4

3 回答 3

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
于 2012-11-19T18:10:50.067 回答
0

在我看来,您正在替换循环内的阅读器对象。修复它(或摆脱它),你可能会有更好的运气让它工作。

于 2012-11-19T18:11:37.360 回答
0

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

于 2019-09-28T11:30:59.973 回答