web-dev-qa-db-fra.com

Comment ajouter une nouvelle colonne à un fichier CSV?

J'ai plusieurs CSV fichiers qui ressemblent à ceci:

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

Je voudrais ajouter une nouvelle colonne à tous les fichiers CSV pour que cela ressemble à ceci:

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

Le script que j'ai jusqu'à présent est le suivant:

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)

Mais dans la sortie, le script ignore chaque ligne et la nouvelle colonne contient uniquement Berry:

Output
Name        Code    Berry
blackberry  1   Berry

wineberry   2   Berry

rasberry    1   Berry

blueberry   1   Berry

mulberry    2   Berry
45
fairyberry

Cela devrait vous donner une idée de ce qu'il faut faire:

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

Edit, notez dans py3k que vous devez utiliser next(r)

Merci d'avoir accepté la réponse. Ici vous avez un bonus (votre script de travail):

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)

Notez s'il vous plaît 

  1. le paramètre lineterminator dans csv.writer. Par défaut, il est réglé sur '\r\n', raison pour laquelle vous utilisez un double espacement.
  2. l'utilisation d'une liste pour ajouter toutes les lignes et pour les écrire enun coup avec writerows. Si votre fichier est très, très volumineux, ceci N’est probablement pas une bonne idée (RAM), mais pour les fichiers normaux, je pense que c’est Plus rapide car il ya moins d’entrées/sorties.
  3. Comme indiqué dans les commentaires de ce message, notez qu'au lieu de Imbriquer les deux instructions with, vous pouvez le faire dans la même ligne:

    avec open ('C: /test/test.csv', 'r') en tant que csvinput, open ('C: /test/output.csv', 'w') en tant que csvoutput:

61
joaquin

Je suis surpris que personne n'ait suggéré de pandas. Bien que l'utilisation d'un ensemble de dépendances telles que Pandas puisse sembler plus lourde que nécessaire pour une tâche aussi facile, elle produit un script très court et Pandas est une excellente bibliothèque pour manipuler toutes sortes de fichiers CSV (et vraiment tous types de données). . Ne peut pas discuter avec 4 lignes de code:

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)

Consultez Site Web Pandas pour plus d'informations!

Contenu de output.csv:

Name,Code,Berries
blackberry,1,blackberry
wineberry,2,wineberry
rasberry,1,rasberry
blueberry,1,blueberry
mulberry,2,mulberry
37
Blairg23
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]])

Peut-être que quelque chose comme ça est ce que vous vouliez?

En outre, CSV représente des valeurs séparées par des virgules. Donc, vous avez besoin de virgules pour séparer vos valeurs, comme ceci:

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

J'ai utilisé des pandas et cela a bien fonctionné .... Pendant que je l'utilisais, j'ai dû ouvrir un fichier, y ajouter des colonnes aléatoires, puis sauvegarder uniquement dans le même fichier.

Ce code ajoute plusieurs entrées de colonne, vous pouvez éditer autant que vous avez besoin.

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 vous voulez que la valeur de la cellule ne soit pas copiée, commencez par créer manuellement une colonne vide dans votre fichier csv, comme si vous l'aviez nomméeHours ajoutez cette ligne dans le code ci-dessus,

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

ou simplement nous pouvons, sans ajouter la colonne manuelle, nous pouvons

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

J'espère que ça aide.

3
giving_the_world

Je ne vois pas où vous ajoutez la nouvelle colonne, mais essayez ceci:

    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++
1
manicphase

Ce code suffira à votre demande et j'ai testé sur le code exemple. 

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]]
1
ashwaqar

Oui C'est une vieille question, mais cela pourrait aider certains

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)
0
Tpk43