2012-06-17 66 views
36

我有几个CSV文件看起来像这样:如何将新列添加到CSV文件?

Input 
Name  Code 
blackberry 1 
wineberry 2 
rasberry 1 
blueberry 1 
mulberry 2 

我想一个新列添加到所有CSV文件,以便它看起来像这样:

Output 
Name  Code Berry 
blackberry 1 blackberry 
wineberry 2 wineberry 
rasberry 1 rasberry 
blueberry 1 blueberry 
mulberry 2 mulberry 

脚本我有到目前为止是这样的:

import csv 
with open(input.csv,'r') as csvinput: 
    with open(output.csv, 'w') as csvoutput: 
     writer = csv.writer(csvoutput) 
     for row in csv.reader(csvinput): 
      writer.writerow(row+['Berry']) 

(Python的3.2)

但在输出时,脚本跳过每行和新列只有在贝里是:

Output 
Name  Code Berry 
blackberry 1 Berry 

wineberry 2 Berry 

rasberry 1 Berry 

blueberry 1 Berry 

mulberry 2 Berry 
+0

可能重复(http://stackoverflow.com/questions/11063707/copy-one-column-to-another-but-with-different-header) –

+0

是否有可能在最后一列中只有'Berry',因为您只是在文件中写入'Berry'? (row + ['Berry']) 你期望写什么? – Dhara

+0

@Dhara:我想将Berry作为标题,并将Name列的值作为Berry的行值。往上看。 – fairyberry

回答

48

这应该给你做什么的想法:

>>> v = open('C:/test/test.csv') 
>>> r = csv.reader(v) 
>>> row0 = r.next() 
>>> row0.append('berry') 
>>> print row0 
['Name', 'Code', 'berry'] 
>>> for item in r: 
...  item.append(item[0]) 
...  print item 
...  
['blackberry', '1', 'blackberry'] 
['wineberry', '2', 'wineberry'] 
['rasberry', '1', 'rasberry'] 
['blueberry', '1', 'blueberry'] 
['mulberry', '2', 'mulberry'] 
>>> 

编辑,请注意py3k必须使用next(r)

感谢您接受答案。在这里,你还有个好处(你的工作脚本):

import csv 

with open('C:/test/test.csv','r') as csvinput: 
    with open('C:/test/output.csv', 'w') as csvoutput: 
     writer = csv.writer(csvoutput, lineterminator='\n') 
     reader = csv.reader(csvinput) 

     all = [] 
     row = next(reader) 
     row.append('Berry') 
     all.append(row) 

     for row in reader: 
      row.append(row[0]) 
      all.append(row) 

     writer.writerows(all) 

请注意

  1. lineterminator参数csv.writer。默认情况下,它是 设置为'\r\n',这就是为什么你有双倍的间距。
  2. 使用列表的追加所有行,并将其与writerows写在 一杆。如果你的文件非常非常大,那么这个 可能不是一个好主意(RAM),但是对于普通文件我认为它的速度更快,因为I/O较少。
  3. 正如评论这篇文章指出,注意代替 嵌套两个with语句,你可以做同一行:

    与开放(“C:/test/test.csv” , 'R')作为csvinput,开( 'C:/test/output.csv', 'W')作为csvoutput:

+0

感谢您的注意。我试过了,它给了我属性错误:'_csv.reader'对象没有'next'属性。你有什么主意吗? – fairyberry

+0

我看到你在py3k中。那么你必须使用next(r)而不是r.next() – joaquin

+0

它现在可以工作。非常感谢你的帮助!! – fairyberry

7
import csv 
with open('input.csv','r') as csvinput: 
    with open('output.csv', 'w') as csvoutput: 
     writer = csv.writer(csvoutput) 

     for row in csv.reader(csvinput): 
      if row[0] == "Name": 
       writer.writerow(row+["Berry"]) 
      else: 
       writer.writerow(row+[row[0]]) 

也许类似的东西是你的原意?

此外,csv代表逗号分隔值。所以,你种的需要英文逗号分隔值这样的,我认为:

Name,Code 
blackberry,1 
wineberry,2 
rasberry,1 
blueberry,1 
mulberry,2 
+0

能完成这项工作吗? – joaquin

+0

我修正了它,所以确实如此,但他的input.csv也是错误的。 – jgritty

+0

@jgritty:谢谢你的帮助。 – fairyberry

1

我没有看到你添加新的列,但试试这个:

import csv 
    i = 0 
    Berry = open("newcolumn.csv","r").readlines() 
    with open(input.csv,'r') as csvinput: 
     with open(output.csv, 'w') as csvoutput: 
      writer = csv.writer(csvoutput) 
      for row in csv.reader(csvinput): 
       writer.writerow(row+","+Berry[i]) 
       i++ 
+0

再次,这是否工作? – joaquin

18

我surpr没有人建议熊猫。虽然使用像Pandas这样的依赖关系可能看起来比这么简单的任务更为重要,但它会产生一个非常短的脚本,Pandas是一个伟大的库,用于处理各种CSV(以及所有数据类型)的数据操作。不能与4行代码争辩:

import pandas as pd 
csv_input = pd.read_csv('input.csv') 
csv_input['Berries'] = csv_input['Name'] 
csv_input.to_csv('output.csv', index=False) 

查看Pandas Website了解更多信息!

内容的output.csv

Name,Code,Berries 
blackberry,1,blackberry 
wineberry,2,wineberry 
rasberry,1,rasberry 
blueberry,1,blueberry 
mulberry,2,mulberry 
+0

谢谢@Jough Dempsey! – Blairg23

+1

哇。惊人的建议! –

1

我用大熊猫和它的工作好... 当我使用它,我不得不打开一个文件,并添加一些随机列,然后保存回只有相同的文件。

此代码添加了多个列条目,您可以根据需要进行编辑。

import pandas as pd 

csv_input = pd.read_csv('testcase.csv')   #reading my csv file 
csv_input['Phone1'] = csv_input['Name']   #this would also copy the cell value 
csv_input['Phone2'] = csv_input['Name'] 
csv_input['Phone3'] = csv_input['Name'] 
csv_input['Phone4'] = csv_input['Name'] 
csv_input['Phone5'] = csv_input['Name'] 
csv_input['Country'] = csv_input['Name'] 
csv_input['Website'] = csv_input['Name'] 
csv_input.to_csv('testcase.csv', index=False) #this writes back to your file 

如果你想要的单元格的值不会得到复制,所以首先手动创建您的CSV文件中的空列,就像你把它命名为小时 那么,现在该你可在上面的代码中加入这一行,

csv_input['New Value'] = csv_input['Hours'] 

或简单地就可以了,而不添加人工列,我们可以

csv_input['New Value'] = '' #simple and easy 

我希望它有帮助。

[复印一列到另一但具有不同的报头]的