2013-04-30 43 views
5

Tôi có dữ liệu sau đây từ tệp csv có tên là temp.Python Chỉnh sửa tiêu đề 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 

tôi cần phải thay đổi các tiêu đề để đọc

Item Number,Item Description,List Price,QTY Available 

Tôi đã được tìm kiếm câu hỏi tương tự trên đây và có không phải là một giải pháp mà tôi có thể hiểu được vì tôi tương đối mới để lập trình python. Cho đến nay tôi có:

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) 

Tôi chỉ đọc tệp gốc và sau đó ghi vào _modified. Làm cách nào để chọn các tiêu đề hiện tại và sau đó thay đổi chúng để chúng ghi vào tệp mới?

Trả lời

10

Tiêu đề chỉ là một hàng dữ liệu CSV khác. Chỉ cần viết chúng dưới dạng hàng mới vào đầu ra, tiếp theo là phần còn lại của dữ liệu từ tệp đầu vào.

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) 

Đối với Python 3, sử dụng:

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

và bạn có thể phải chỉ định một mã hóa cho dữ liệu của bạn.

+0

Khi tôi cố gắng để chạy các kịch bản tôi nhận được Lỗi Loại: writerow() lấy chính xác một đối số (4 đã cho). – barkl3y

+3

Cách thông thường để gọi 'next' trong Python 3 là' next (r) '(một tham số). Đối với những người đang sử dụng Python 2, nó sẽ là 'r.next()'. (Tôi có thể suy ra từ bình luận của OP rằng anh ta không có vấn đề gì với lời kêu gọi tiếp theo của bạn, mặc dù vậy.) –

+1

@ barkl3y: Vâng, nhóm tất cả các đối số vào một danh sách hoặc bộ đầu tiên. (Chỉ cần đặt một cặp dấu ngoặc vuông hoặc một bộ thứ hai của các parens xung quanh các đối số.) –

0

Bạn có thể sử dụng fileinput cho việc này:

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

Một giải pháp khác là sử dụng các mô-đun fileinput để cập nhật các tập tin tại chỗ:

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, 
Các vấn đề liên quan