2013-10-01 44 views
1

我有一些csv格式的数据,我需要将第三列乘以第六列并将结果附加到结尾。我的数据如下:如何在csv文件中将一列乘以另一列并重新写入

TITLE,TITLE,T,T,T,T 
data,data,5,data,data,98.7,data 
data,data,2,data,data,97,data 
data,data,5,data,data,98,data 
data,data,4,data,data,8.7,data 
data,data,5,data,data,9.7,data 
data,data,12.5,data,data,198.7,data 

我真正的新的编码,但我尝试如下:从收藏 导入CSV 进口日期时间 进口副本 导入defaultdict

class_col = 2 
data_col = 5 

with open('minitest.csv', 'r') as f: 
    data = [line.strip().split(',') for line in f] 

for row in data: 
    class_col*data_col 

with open('minitest_edit.csv', 'w') as nf: 
    nf.write('\n'.join(','.join(row) for row in data)) 

print "done" 

我没不会出现任何错误,有什么建议吗?由于OS”

+0

你应该接受一个答案 - 有很多好的答案。 –

回答

3

这是如何更有效地做到这一点的方法,即通过不读取d ata在内存中,这将与更大的数据集有关:

import csv 
import tempfile 
import shutil 

input_file = 'minitest.csv' 

with open(input_file, 'rb') as f, \ 
    tempfile.NamedTemporaryFile(delete=False) as out_f: 

    # in order to be able to not have to read everything in memory, we have to 
    # write every processed row to disk immediatley; for that, we need a temporary 
    # file because we can't read and write a single file at the same time: 
    reader = csv.reader(f) 
    writer = csv.writer(out_f) 

    # header row 
    writer.writerow(next(reader)) 

    # note that this uses a generator not a list, so that writerows will lazily 
    # evaluate each row as it writes them to disk 
    writer.writerows(row + [float(row[2]) * float(row[5])] for row in reader) 

# one everything's done, overwrite the original file with the new contents. 
shutil.move(out_f.name, input_file) 

P.S.如果你只是没有写回到同一个文件中,它实际上会更简单 - 在处理代码完成之后,你总是可以手动执行移动,以便简化处理代码。

+0

接受了这个答案,因为我真的很感激当人们提出意见:) – OliverSteph

+1

@OliverSteph:我刚刚修复了代码中的一些小错误,顺便说一句。 –

4

你想下面的繁殖栏位,并把它们添加到原有的:

new_data = [] 
for row in data: 
    new_data.append(row + [float(row[class_col]) * float(row[data_col])]) 
+0

如果'row'是一个列表,我认为它是,你的代码将在运行时抛出一个'TypeError';另外,使用列表理解而不是for循环会是惯用的。 –

+0

@ErikAllik更正了列表连接错误并将字符串转换为'float' –

5

使用csv.readercsv.writer

import csv 


with open('minitest.csv', 'rb') as f: 
    reader = csv.reader(f) 
    data = [next(reader)] # title row 
    for row in reader: 
     data.append(row + [float(row[2]) * float(row[5])]) 

with open('minitest.csv', 'wb') as nf: 
    writer = csv.writer(nf) 
    writer.writerows(data) 

生产:

TITLE,TITLE,T,T,T,T 
data,data,5,data,data,98.7,data,493.5 
data,data,2,data,data,97,data,194.0 
data,data,5,data,data,98,data,490.0 
data,data,4,data,data,8.7,data,34.8 
data,data,5,data,data,9.7,data,48.5 
data,data,12.5,data,data,198.7,data,2483.75 
+1

应该打开CSV文件并用'rb'和'wb'写入。而且,通过在与阅读相同的循环中进行书写,可以使代码更加高效 - 这样您就不必读取内存中的所有内容。如果问题是你不能写入你正在阅读的文件,你可以使用'tempfile'和'mv'。 –

相关问题