按原样写下每一行';在python中使用for循环处理,但只编写第一行
我有一些代码,我正试图优化,以提高效率。其中一部分是处理我的文件,处理完每一行后,立即将其写入按原样写下每一行';在python中使用for循环处理,但只编写第一行,python,csv,read-write,Python,Csv,Read Write,我有一些代码,我正试图优化,以提高效率。其中一部分是处理我的文件,处理完每一行后,立即将其写入csv。这非常理想,因为这样我就不会因为处理数据而浪费内存,然后将数据加载到列表中以写出整个列表。如果我将整个处理过的数据添加到列表中,我可以毫无困难地将其写入csv,如下所示,在下将折叠的数据写入csv: 注意:#数据处理下的代码是可靠的,我只需要帮助在处理每一行时写出它。 # data processing seen = set() folded_data = [] for u in name_no
csv
。这非常理想,因为这样我就不会因为处理数据而浪费内存,然后将数据加载到列表中以写出整个列表。如果我将整个处理过的数据添加到列表中,我可以毫无困难地将其写入csv
,如下所示,在下将折叠的数据写入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)
然而,当我尝试在处理过程中写出每一行时,我只得到'out_file.csv'中的第一行
# 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 line to csv
with open('out_file.csv', 'wb') as f:
writer = csv.writer(f)
writer.writerow(row)
我已经尝试着移动我的编写代码来实现我希望的工作,但我还没能理解 我怀疑你是第一行还是最后一行。对于您写出的每一行,您都会重新打开文件,删除以前的内容。打开文件并在循环之外创建csv编写器。我不会担心“浪费”内存,除非您的程序要求(例如)超过系统内存的1/2。如果您的CSV在数十亿字节(或更大)范围内,则这是一个问题 如果您的csv没有这么大,您的文件将在内存中的OS文件缓存中结束,除非您有一些非标准的内核设置
要以“高效”的方式(即不将数据显式存储在内存中),您需要在for循环之前打开文件。在@etep和@MarkRansom的帮助下解决了这个问题!在整个
for循环
之前,我必须打开文件并定义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)
你是想优化速度还是内存?@mattingly890-主要是内存,就像目前一样,试图将所有内容加载到列表中,然后写出列表,我的内存不足。虽然让它跑得更快也不是件坏事!:)我试图写出的文件大约占我系统内存的3/4。