¿Cómo agregar una nueva columna a un archivo CSV?

Tengo varios archivos CSV que se parecen a esto:

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

Me gustaría agregar una nueva columna a todos los archivos CSV para que se vea 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 ahora es este:

 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, el script omite todas las líneas y la nueva columna solo contiene Berry:

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

Esto debería 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'] >>> 

Edite, tenga en cuenta que en py3k debe usar next(r)

Gracias por aceptar la respuesta. Aquí tienes un bonus (tu guión 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. lineterminator parámetro csv.writer en csv.writer . De forma predeterminada, se establece en '\r\n' y es por eso que tiene doble espacio.
  2. el uso de una lista para añadir todas las líneas y escribirlas de una sola vez con writerows . Si su archivo es muy, muy grande, probablemente no sea una buena idea (RAM), pero para los archivos normales, creo que es más rápido porque hay menos E / S.
  3. Como se indica en los comentarios de esta publicación, tenga en cuenta que, en lugar de anidar 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:

Me sorprende que nadie sugiera Pandas. Aunque el uso de un conjunto de dependencias como Pandas puede parecer más torpe de lo necesario para una tarea tan fácil, produce una secuencia de comandos muy breve y Pandas es una gran biblioteca para realizar todo tipo de manipulación de datos CSV (y realmente todo tipo 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) 

¡Visita el sitio web de Pandas 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 
 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 así es lo que pretendías?

Además, csv significa valores separados por comas. Entonces, como que necesitas comas para separar tus valores como este, creo:

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

Utilicé pandas y funcionó bien … Mientras lo estaba usando, tuve que abrir un archivo y agregarle algunas columnas aleatorias y luego volver a guardarlo solo en el mismo archivo.

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 la celda no se copie, en primer lugar, cree una columna vacía en su archivo csv manualmente, como lo nombró como Horas y luego, para esto, puede agregar esta línea en el código anterior,

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

o simplemente podemos, sin agregar la columna manual, podemos

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

Espero que ayude.

No veo dónde está agregando 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++ 

Este código será suficiente para su solicitud y lo he probado en el código de muestra.

 import csv with open(in_path, 'r') as f_in, open(out_path, 'w') as f_out: csv_reader = csv.reader(f_in, delimiter=';') writer = csv.writer(f_out) for row in csv_reader: writer.writerow(row + [row[0]] 

Sí. Es una vieja pregunta, pero podría ayudar a algunos.

 import csv import uuid # read and write csv files with open('in_file','r') as r_csvfile: with open('out_file','w',newline='') as w_csvfile: dict_reader = csv.DictReader(r_csvfile,delimiter='|') #add new column with existing fieldnames = dict_reader.fieldnames + ['ADDITIONAL_COLUMN'] writer_csv = csv.DictWriter(w_csvfile,fieldnames,delimiter='|') writer_csv.writeheader() for row in dict_reader: row['ADDITIONAL_COLUMN'] = str(uuid.uuid4().int >> 64) [0:6] writer_csv.writerow(row)