在python中使用forloop处理每一行,但只写第一个lin

2024-09-26 17:37:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些代码,我正试图优化以提高效率。其中一部分是处理我的文件,在处理完每一行之后,立即将其写入csv。这是理想的,因为我不会浪费内存,处理数据,然后将数据加载到一个列表中写出整个列表。如果我将整个处理过的数据添加到一个列表中,我可以毫不费力地将其写入csv,如下所示,在# write folded_data to csv下:

注意:数据处理下的代码是可靠的,我只需要在处理每一行时帮助我写出。

# data processing
seen = set()
folded_data = []
for u in name_nodes:
#    seen=set([u]) # print both u-v, and v-u
    seen.add(u) # don't print v-u
    unbrs = set(B[u])
    nbrs2 = set((n for nbr in unbrs for n in B[nbr])) - seen
    for v in nbrs2:
        vnbrs = set(B[v])
        common = unbrs & vnbrs
        weight = len(common)
        row = u, v, weight
        folded_data.append(row)

# write folded_data to csv
with ('out_file.csv', 'wb') as f:
    writer = csv.writer(f)
    writer.writerows(folded_data)

但是,当我试图在处理过程中写出每个row时,我只得到第一行_文件.csv'. 在

^{pr2}$

我试着把我写的代码移到我想要的地方,但是我一直没能弄明白。在


Tags: 文件csv数据代码in列表fordata
3条回答

我怀疑你得到的是第一行,最后一行。对于写出的每一行,都是重新打开文件,删除以前的内容。将文件打开,并在循环之外创建csv writer。在

在@etep和@MarkRansom的帮助下解决了这个问题!我必须打开文件并在整个for-loop之前定义writer。在

# open file and define writer
with open('out_file.csv', 'wb') as f:
    writer = csv.writer(f)

    # data processing
    seen = set()
    for u in name_nodes:
    #    seen=set([u]) # print both u-v, and v-u
        seen.add(u) # don't print v-u
        unbrs = set(B[u])
        nbrs2 = set((n for nbr in unbrs for n in B[nbr])) - seen
        for v in nbrs2:
            vnbrs = set(B[v])
            common = unbrs & vnbrs
            weight = len(common)
            row = u, v, weight
            # write row for each record
            writer.writerow(row)

我不会担心“浪费”内存,除非您的程序要求(例如)大于系统内存的1/2。如果您的CSV在千兆字节范围(或更大),那么这是一个问题。在

如果你的csv不是这么大,除非你有一些非标准的内核设置,否则你的文件将在内存中的OS文件缓存中结束。在

为了以“高效”的方式(即不显式地将数据存储在内存中),您需要在for循环之前打开文件。在

相关问题 更多 >

    热门问题