2013-04-30 18 views
5

Ho i seguenti dati da un file csv chiamato temp.Python Modifica intestazioni 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 

ho bisogno di cambiare le intestazioni di leggere

Item Number,Item Description,List Price,QTY Available 

ho cercato domande simili su questo sito e non ho una soluzione che posso capire perché io sono relativamente nuovo alla programmazione python. Finora ho:

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) 

Quale so solo legge il file originale e quindi scriverà su _modified. Come seleziono le intestazioni correnti e poi le cambio in modo che scrivano nel nuovo file?

risposta

10

Le intestazioni sono solo un'altra riga di dati CSV. Basta scriverli come una nuova riga per l'output seguito dal resto dei dati dal file di input.

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) 

Per Python 3, utilizzare:

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

e potrebbe essere necessario specificare una codifica per i dati.

+0

Quando provo ad eseguire lo script ottengo TypeError: writow() prende esattamente un argomento (4 dato). – barkl3y

+3

Il solito modo di chiamare 'next' in Python 3 è' next (r) '(un parametro). Per coloro che usano Python 2, sarebbe 'r.next()'. (Posso dedurre dal commento di OP che non ha avuto un problema con la tua chiamata 'next', però.) –

+1

@ barkl3y: Sì, raggruppa tutti gli argomenti in una lista singola o tupla prima. (Basta mettere un paio di parentesi quadre o un secondo set di parenti attorno agli argomenti.) –

0

Si potrebbe utilizzare fileinput per questo:

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

Un'altra soluzione è quella di utilizzare il modulo fileinput per aggiornare il file al suo posto:

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, 
Problemi correlati