2013-04-30 20 views
5

Mam następujące dane z pliku csv o nazwie temp.Python Edytuj nagłówki 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 

muszę zmienić nagłówki czytać

Item Number,Item Description,List Price,QTY Available 

I zostały poszukiwania podobnych pytań na ten temat tutaj i nie mają rozwiązania, które mogę zrozumieć, ponieważ jestem stosunkowo nowy do programowania Python. Do tej pory mam:

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) 

Co wiem, tylko odczytuje oryginalny plik, a następnie napiszę do _modyfikowanego. Jak wybrać bieżące nagłówki, a następnie zmienić je tak, aby zapisywały się do nowego pliku?

Odpowiedz

10

Nagłówki to tylko kolejny wiersz danych CSV. Po prostu zapisz je jako nowy wiersz do danych wyjściowych, a następnie pozostałe dane z pliku wejściowego.

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) 

dla Pythona 3, należy:

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

i być może trzeba będzie określić kodowanie danych.

+0

Kiedy próbuję uruchomić skrypt otrzymuję TypeError: writerow() przyjmuje dokładnie jeden argument (4 dane). – barkl3y

+3

Najczęstszym sposobem wywołania 'next' w Pythonie 3 jest' next (r) '(jeden parametr). Dla tych, którzy używają Pythona 2, będzie to 'r.next()'. (Mogę wywnioskować z komentarza OP, że nie miał problemu z twoją następną inwokacją, jednak;) –

+1

@ barkl3y: Tak, zgrupuj wszystkie argumenty w jedną listę lub krotkę. (Po prostu umieść parę nawiasów kwadratowych lub drugi zestaw parenów wokół argumentów.) –

0

Można użyć fileinput na to:

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

Innym rozwiązaniem jest użycie modułu fileinput zaktualizować plik w lokalu:

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,