2012-06-17 4 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

возможно, у вас есть только «Берри» в последнем столбце, потому что вы только пишете «Берри» в файл? (row + ['Berry']) Что вы ожидали написать? – Dhara

+0

@Dhara: Я хотел бы иметь значение Berry в качестве заголовка и имени столбца как значение строки для 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. Если ваш файл очень, очень большой, это , вероятно, это не очень хорошая идея (ОЗУ), но для обычных файлов я думаю, что это быстрее, потому что меньше ввода-вывода.
  3. Как указано в комментариях к этому сообщению, обратите внимание, что вместо гнездятся два with заявления, вы можете сделать это в той же строке:

    с открытым («C: /test/test.csv» , 'г'), как csvinput, открытый ('C: /test/output.csv', 'ж'), как csvoutput:

+0

спасибо за примечание. Я попытался, и это дает мне ошибку атрибута: объект «_csv.reader» не имеет атрибута «next». Есть ли у вас какие-либо идеи? – fairyberry

+0

Я вижу, что вы в py3k. то вы должны использовать следующий (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

Я удивлен никто не предложил Панды. Хотя использование набора зависимостей, таких как 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 

Надеюсь, это поможет.

Смежные вопросы