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
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
lineterminator
dans csv.writer
. Par défaut, il est réglé sur '\r\n'
, raison pour laquelle vous utilisez un double espacement.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.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:
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
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
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.
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++
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]]
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)