2012-06-17 16 views
36

Ho diversi CSV file che assomigliano a questo:Come aggiungere una nuova colonna in un file CSV?

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

vorrei aggiungere una nuova colonna a tutti i file CSV in modo che sarebbe simile a questa:

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

Lo script che ho finora è questo:

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)

Ma in uscita, lo script salta ogni linea e la nuova colonna ha solo Berry in esso:

Output 
Name  Code Berry 
blackberry 1 Berry 

wineberry 2 Berry 

rasberry 1 Berry 

blueberry 1 Berry 

mulberry 2 Berry 
+0

possibile duplicato di [Copia una colonna in un'altra ma con un'intestazione diversa] (http://stackoverflow.com/questions/11063707/copy-one-column-to-another-but-with-different-header) –

+0

è possibile che tu abbia solo "Berry" nella tua ultima colonna perché stai scrivendo solo "Berry" nel file? (riga + ['Berry']) Cosa ti aspettavi di scrivere? – Dhara

+0

@Dhara: Mi piacerebbe avere Berry come intestazione e il valore della colonna Nome come valore di riga per la bacca. Vedi sopra. – fairyberry

risposta

48

Questo dovrebbe darvi un'idea di cosa fare:

>>> 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'] 
>>> 

Modifica, nota in py3k è necessario utilizzare next(r)

Grazie per aver accettato la risposta. Qui si ha un bonus (lo script di lavoro):

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) 

Si prega di notare

  1. il parametro lineterminator in csv.writer. Per impostazione predefinita è impostato su '\r\n' ed è per questo che si dispone di una spaziatura doppia.
  2. l'uso di un elenco per aggiungere tutte le righe e scriverle in un colpo con writerows. Se il tuo file è molto, molto grande questo probabilmente non è una buona idea (RAM) ma per i file normali penso che sia più veloce perché c'è meno I/O.
  3. Come indicato nei commenti di questo post, si noti che invece di nidificazione delle due with dichiarazioni, è possibile farlo nella stessa linea:

    con aperta ('C: /test/test.csv' , 'r') come csvinput, aperta ('C: /test/output.csv', 'w') come csvoutput:

+0

grazie per la nota. Ho provato e mi dà errore di attributo: l'oggetto '_csv.reader' non ha attributo 'next'. Hai qualche idea? – fairyberry

+0

Vedo che sei in Py3K. allora devi usare next (r) invece di r.next() – joaquin

+0

funziona ora. Grazie mille per il vostro aiuto!! – 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]]) 

Forse qualcosa di simile che corrisponde a quella desiderata?

Inoltre, csv indica valori separati da virgola. Quindi, è sorta di bisogno le virgole per separare i valori in questo modo penso:

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

funziona? – joaquin

+0

L'ho risolto, così fa, ma anche il suo input.csv è sbagliato. – jgritty

+0

@jgritty: grazie per il tuo aiuto. – fairyberry

1

non vedo dove si sta aggiungendo la nuova colonna, ma provare questo:

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

di nuovo, funziona? – joaquin

18

sono Surpr nessuno ha suggerito panda. Sebbene l'uso di un insieme di dipendenze come Panda possa sembrare più pesante di quanto sia necessario per un compito così facile, produce uno script molto breve e Pandas è una grande libreria per fare ogni tipo di manipolazione dei dati CSV (e in realtà tutti i tipi di dati) .Non è possibile discutere con 4 righe di codice:

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) 

Partenza Pandas Website per maggiori informazioni!

Contenuto del output.csv:

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

Grazie @Jough Dempsey! – Blairg23

+1

wow. suggerimento incredibile! –

1

ho usato i panda e ha funzionato bene ... Mentre lo stavo usando, ho dovuto aprire un file e aggiungere alcune colonne casuali ad esso e quindi salvare di nuovo a solo lo stesso file.

Questo codice aggiunge più voci di colonna, è possibile modificare quanto necessario.

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 

Se si vuole che il valore delle cellule non si copia, quindi prima di tutto creare una colonna vuota nel file CSV manualmente, come hai nominato come Ore poi, ora per questo si può aggiungere questa riga nel codice precedente,

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

o semplicemente possiamo, senza aggiungere la colonna manuale, possiamo

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

Spero che sia d'aiuto.

Problemi correlati