2012-06-17 256 views
36

Tengo varios CSV archivos que se ven así:¿Cómo agregar una nueva columna a un archivo CSV?

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

Me gustaría añadir una nueva columna a todos los archivos CSV para que se vería así:

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

El guión que tengo hasta el momento es la siguiente:

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)

Pero en la salida, se salta el guión cada línea y la nueva columna sólo tiene Berry en ella:

Output 
Name  Code Berry 
blackberry 1 Berry 

wineberry 2 Berry 

rasberry 1 Berry 

blueberry 1 Berry 

mulberry 2 Berry 
+0

posible copia de [Copie una columna a otra pero con encabezado diferente] (http://stackoverflow.com/questions/11063707/copy-one-column-to-another-but-with-different-header) –

+0

¿Es posible que solo tengas 'Berry' en tu última columna porque solo estás escribiendo 'Berry' en el archivo? (fila + ['Berry']) ¿Qué esperabas escribir? – Dhara

+0

@Dhara: me gustaría tener a Berry como un encabezado y valor de la columna Nombre como valor de fila para el Berry. Véase más arriba. – fairyberry

Respuesta

48

Esto debe darle una idea de qué hacer:

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

Editar, nota en py3k deberá utilizar next(r)

Gracias por aceptar la respuesta. Aquí tienes una bonificación (la secuencia de comandos de trabajo):

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) 

Tenga en cuenta

  1. el parámetro lineterminator en csv.writer. Por defecto es establecido en '\r\n' y es por eso que tiene doble espacio.
  2. el uso de una lista para anexar todas las líneas y escribirlas en una instantánea con writerows. Si su archivo es muy, muy grande, este probablemente no sea una buena idea (RAM), pero para archivos normales creo que es más rápido porque hay menos E/S.
  3. Como se indica en los comentarios de esta entrada, tenga en cuenta que en lugar de anidación los dos with declaraciones, puede hacerlo en la misma línea:

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

+0

gracias por la nota. Intenté y me da error de atributo: el objeto '_csv.reader' no tiene el atributo 'siguiente'. ¿Tiene alguna idea? – fairyberry

+0

Veo que estás en py3k. luego debe usar next (r) en lugar de r.next() – joaquin

+0

que funciona ahora. ¡¡Muchas gracias por tu ayuda!! – 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]]) 

tal vez algo como eso es lo que pretende?

Además, csv significa valores separados por comas. Por lo tanto, tipo de Need comas para separar los valores como esto pienso:

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

hace esto? – joaquin

+0

Lo arreglé, por lo que lo hace, pero su input.csv también está mal. – jgritty

+0

@jgritty: gracias por su ayuda. – fairyberry

1

no veo donde va a añadir la nueva columna, pero intente esto:

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

de nuevo, ¿esto funciona? – joaquin

18

I'm surpr Nadie sugirió pandas. Aunque usar un conjunto de dependencias como Pandas puede parecer más severo de lo que es necesario para una tarea tan fácil, produce un script muy corto y Pandas es una gran biblioteca para hacer todo tipo de manipulación de datos CSV (y realmente todos los tipos de datos) .No se puede discutir con 4 líneas de código:

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) 

Salida Pandas Website para más información!

Contenido de output.csv:

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

Gracias @Jough Dempsey! – Blairg23

+1

wow. sugerencia increíble! –

1

que utilizan los pandas y ha funcionado bien ... Mientras lo estaba usando, tuve que abrir un archivo y añadir algunas columnas al azar a él y luego volver a guardar mismo archivo solo

Este código agrega varias entradas de columna, puede editar todo lo que necesite.

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 

Si desea que el valor de celda no se copia, por lo que en primer lugar crear una columna vacía en el archivo CSV de forma manual, al igual que lo nombró como Horas entonces, ya por esto puede agregar esta línea de código anterior,

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

o simplemente podemos, sin añadir la columna manual, podemos

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

Espero que ayude.

Cuestiones relacionadas