2013-04-30 78 views
5

我從一個名爲temp的csv文件中獲得以下數據。Python編輯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 

我需要改變標題閱讀

Item Number,Item Description,List Price,QTY Available 

我一直在尋找在這裏類似的問題,並沒有一個解決方案,我能理解,因爲我是比較新的Python編程。到目前爲止,我有:

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) 

我知道只讀取原始文件,然後將寫入_modified。如何選擇當前標題,然後更改它們以便寫入新文件?

回答

10

標題只是另一行CSV數據。只需將它們寫入輸出的新行,然後再輸入來自輸入文件的其餘數據。

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) 

對於Python 3,使用方法:

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

,你可能必須指定編碼爲您的數據。

+0

當我嘗試運行該腳本,我得到類型錯誤: writerow()只需要一個參數(給定4)。 – barkl3y 2013-04-30 18:50:40

+3

在Python 3中調用'next'的通常方法是'next(r)'(一個參數)。對於那些使用Python 2的人來說,它會是'r.next()'。 (我可以從OP的評論中推斷出他對'next'調用沒有問題,但是;) – 2013-04-30 18:52:18

+1

@ barkl3y:是的,先將所有參數分組到一個列表或元組中。 (只需在參數的周圍放一對方括號或第二組parens。) – 2013-04-30 18:55:45

0

您可以使用fileinput此:

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

另一種解決方案是使用fileinput模塊更新替代文件:

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,