2013-04-30 4 views
5

J'ai les données suivantes d'un fichier csv appelé temp.Python Modifier les en-têtes CSV

Item,Description,Base Price,Available 
2000-000-000-300,AC - CF/M Series Green For Black Hood,299.99,3 
2000-000-000-380,AC - CF/M Series Green For White Hood,299.99,3 

Je dois changer les en-têtes pour lire

Item Number,Item Description,List Price,QTY Available 

J'ai cherché des questions similaires sur ce site et ai pas une solution que je peux comprendre que je suis relativement nouveau à la programmation de python. Jusqu'à présent, j'ai:

import csv 
import os 

inputFileName = "temp.csv" 
outputFileName = os.path.splitext(inputFileName)[0] + "_modified.csv" 

with open(inputFileName) as inFile, open(outputFileName, "w") as outfile: 
    r = csv.reader(inFile) 
    w = csv.writer(outfile) 

Ce que je sais ne lit que le fichier d'origine, puis écrira à _modified. Comment puis-je sélectionner les en-têtes actuels, puis les modifier pour qu'ils écrivent dans le nouveau fichier?

Répondre

10

Les en-têtes sont juste une autre ligne de données CSV. Il suffit de les écrire comme une nouvelle ligne à la sortie suivie par le reste des données du fichier d'entrée.

import csv 
import os 

inputFileName = "temp.csv" 
outputFileName = os.path.splitext(inputFileName)[0] + "_modified.csv" 

with open(inputFileName, 'rb') as inFile, open(outputFileName, 'wb') as outfile: 
    r = csv.reader(inFile) 
    w = csv.writer(outfile) 

    next(r, None) # skip the first row from the reader, the old header 
    # write new header 
    w.writerow(['Item Number', 'Item Description', 'List Price', 'QTY Available']) 

    # copy the rest 
    for row in r: 
     w.writerow(row) 

Pour Python 3, utilisez:

with open(inputFileName, newline='') as inFile, open(outputFileName, 'w', newline='') as outfile: 

et vous pouvez avoir à spécifier un encodage pour vos données.

+0

Lorsque je tente d'exécuter le script que je reçois TypeError: writerow() prend exactement un argument (4 donné). – barkl3y

+3

La méthode habituelle pour appeler 'next' dans Python 3 est' next (r) '(un paramètre). Pour ceux qui utilisent Python 2, ce serait 'r.next()'. (Je peux déduire du commentaire d'OP qu'il n'a pas eu de problème avec votre invocation 'next', cependant.;) –

+1

@ barkl3y: Oui, groupez tous les arguments dans une seule liste ou un premier rang. (Il suffit de mettre une paire de crochets ou un second ensemble de parens autour des arguments.) –

0

Vous pouvez utiliser fileinput pour cela:

import fileinput 
import sys 
import os 

inputFileName = "temp.csv" 
outputFileName = os.path.splitext(inputFileName)[0] + "_modified.csv" 

with open(outputFileName, "w") as outfile: 
    for line in fileinput.input(
     [inputFileName], 
     inplace=False): 
     if fileinput.isfirstline(): 
      outfile.write('Item Number,Item Description,List Price,QTY Available\n') 
     else: 
      outfile.write(line) 
2

Une autre solution consiste à utiliser le module fileinput de mettre à jour le fichier en place:

import fileinput 
for line in fileinput.input('temp', inplace=True): 
    if fileinput.isfirstline(): 
     print 'Item Number,Item Description,List Price,QTY Available' 
    else: 
     print line,