2012-06-17 68 views
36

Tôi có một vài CSV file mà trông như thế này:Cách thêm cột mới vào tệp CSV?

Input 
Name  Code 
blackberry 1 
wineberry 2 
rasberry 1 
blueberry 1 
mulberry 2 

Tôi muốn thêm một cột mới vào tất cả các file CSV để nó sẽ trông như thế này:

Output 
Name  Code Berry 
blackberry 1 blackberry 
wineberry 2 wineberry 
rasberry 1 rasberry 
blueberry 1 blueberry 
mulberry 2 mulberry 

Các kịch bản tôi có cho đến nay là thế này:

import csv 
with open(input.csv,'r') as csvinput: 
    with open(output.csv, 'w') as csvoutput: 
     writer = csv.writer(csvoutput) 
     for row in csv.reader(csvinput): 
      writer.writerow(row+['Berry']) 

(Python 3.2)

Nhưng trong đầu ra, kịch bản sẽ bỏ qua tất cả các dòng và cột mới chỉ có Berry trong đó:

Output 
Name  Code Berry 
blackberry 1 Berry 

wineberry 2 Berry 

rasberry 1 Berry 

blueberry 1 Berry 

mulberry 2 Berry 
+0

bản sao có thể có của [Sao chép một cột sang cột khác nhưng với tiêu đề khác] (http://stackoverflow.com/questions/11063707/copy-one-column-to-another-but-with-different-header) –

+0

có thể bạn chỉ có 'Berry' trong cột cuối cùng của bạn bởi vì bạn chỉ viết 'Berry' vào tệp? (hàng + ['Berry']) Bạn mong đợi gì để viết? – Dhara

+0

@Dhara: Tôi muốn có Berry làm tiêu đề và giá trị Tên cột làm giá trị hàng cho Berry. Xem ở trên. – fairyberry

Trả lời

48

này nên cung cấp cho bạn một ý tưởng về những việc cần làm:

>>> v = open('C:/test/test.csv') 
>>> r = csv.reader(v) 
>>> row0 = r.next() 
>>> row0.append('berry') 
>>> print row0 
['Name', 'Code', 'berry'] 
>>> for item in r: 
...  item.append(item[0]) 
...  print item 
...  
['blackberry', '1', 'blackberry'] 
['wineberry', '2', 'wineberry'] 
['rasberry', '1', 'rasberry'] 
['blueberry', '1', 'blueberry'] 
['mulberry', '2', 'mulberry'] 
>>> 

Chỉnh sửa, lưu ý trong py3k bạn phải sử dụng next(r)

Cảm ơn bạn đã chấp nhận câu trả lời. Ở đây bạn có một tiền thưởng (kịch bản làm việc của bạn):

import csv 

with open('C:/test/test.csv','r') as csvinput: 
    with open('C:/test/output.csv', 'w') as csvoutput: 
     writer = csv.writer(csvoutput, lineterminator='\n') 
     reader = csv.reader(csvinput) 

     all = [] 
     row = next(reader) 
     row.append('Berry') 
     all.append(row) 

     for row in reader: 
      row.append(row[0]) 
      all.append(row) 

     writer.writerows(all) 

Xin lưu ý

  1. tham số lineterminator trong csv.writer. Theo mặc định, nó là được đặt thành '\r\n' và đây là lý do tại sao bạn có khoảng cách gấp đôi.
  2. việc sử dụng danh sách để thêm tất cả các dòng và viết chúng trong một ảnh với writerows. Nếu tệp của bạn rất, rất lớn, có lẽ không phải là một ý tưởng hay (RAM) nhưng đối với các tệp bình thường, tôi cho rằng nó nhanh hơn vì có ít I/O hơn.
  3. Như đã nêu trong các ý kiến ​​để bài này, lưu ý rằng thay vì làm tổ hai with báo cáo, bạn có thể làm điều đó trong cùng một dòng:

    với open ('C: /test/test.csv' , 'r') như csvinput, open ('C: /test/output.csv', 'w') như csvoutput:

+0

cảm ơn ghi chú. Tôi đã thử và nó mang lại cho tôi lỗi thuộc tính: '_csv.reader' đối tượng không có thuộc tính 'next'. Bạn còn ý kiến ​​nào không? – fairyberry

+0

Tôi thấy bạn đang ở py3k. sau đó bạn phải sử dụng tiếp theo (r) thay vì r.next() – joaquin

+0

nó hoạt động ngay bây giờ. Cảm ơn rất nhiều vì sự giúp đỡ của bạn!! – fairyberry

7
import csv 
with open('input.csv','r') as csvinput: 
    with open('output.csv', 'w') as csvoutput: 
     writer = csv.writer(csvoutput) 

     for row in csv.reader(csvinput): 
      if row[0] == "Name": 
       writer.writerow(row+["Berry"]) 
      else: 
       writer.writerow(row+[row[0]]) 

Có lẽ một cái gì đó như thế là những gì bạn mong đợi?

Ngoài ra, csv là viết tắt của giá trị được phân tách bằng dấu phẩy. Vì vậy, bạn phần nào cần dấu phẩy để tách giá trị của bạn như thế này tôi nghĩ:

Name,Code 
blackberry,1 
wineberry,2 
rasberry,1 
blueberry,1 
mulberry,2 
+0

tính năng này có hoạt động không? – joaquin

+0

Tôi đã sửa nó, vì vậy, nhưng input.csv của anh ấy cũng sai. – jgritty

+0

@jgritty: cảm ơn sự giúp đỡ của bạn. – fairyberry

1

tôi không thấy nơi bạn đang thêm các cột mới, nhưng hãy thử điều này:

import csv 
    i = 0 
    Berry = open("newcolumn.csv","r").readlines() 
    with open(input.csv,'r') as csvinput: 
     with open(output.csv, 'w') as csvoutput: 
      writer = csv.writer(csvoutput) 
      for row in csv.reader(csvinput): 
       writer.writerow(row+","+Berry[i]) 
       i++ 
+0

một lần nữa, tính năng này có hoạt động không? – joaquin

18

Tôi là người mẫu không có ai đề nghị gấu trúc. Mặc dù sử dụng một bộ phụ thuộc như Pandas có vẻ nặng nề hơn là cần thiết cho một nhiệm vụ dễ dàng như vậy, nó tạo ra một kịch bản rất ngắn và Pandas là một thư viện tuyệt vời để thực hiện tất cả các loại thao tác dữ liệu CSV (và thực sự tất cả các kiểu dữ liệu) .Không thể tranh luận với 4 dòng mã:

import pandas as pd 
csv_input = pd.read_csv('input.csv') 
csv_input['Berries'] = csv_input['Name'] 
csv_input.to_csv('output.csv', index=False) 

Kiểm tra Pandas Website để biết thêm thông tin!

Nội dung output.csv:

Name,Code,Berries 
blackberry,1,blackberry 
wineberry,2,wineberry 
rasberry,1,rasberry 
blueberry,1,blueberry 
mulberry,2,mulberry 
+0

Cảm ơn @Jough Dempsey! – Blairg23

+1

wow. gợi ý tuyệt vời! –

1

tôi đã sử dụng gấu trúc và nó làm việc tốt ... Trong khi tôi đang sử dụng nó, tôi đã phải mở một tập tin và thêm một số cột ngẫu nhiên vào nó và sau đó lưu lại cùng một tệp.

Mã này thêm nhiều mục nhập cột, bạn có thể chỉnh sửa bao nhiêu bạn cần.

import pandas as pd 

csv_input = pd.read_csv('testcase.csv')   #reading my csv file 
csv_input['Phone1'] = csv_input['Name']   #this would also copy the cell value 
csv_input['Phone2'] = csv_input['Name'] 
csv_input['Phone3'] = csv_input['Name'] 
csv_input['Phone4'] = csv_input['Name'] 
csv_input['Phone5'] = csv_input['Name'] 
csv_input['Country'] = csv_input['Name'] 
csv_input['Website'] = csv_input['Name'] 
csv_input.to_csv('testcase.csv', index=False) #this writes back to your file 

Nếu bạn muốn rằng giá trị của ô không được sao chép, vì vậy trước hết là tạo ra một cột trống trong file csv của bạn bằng tay, giống như bạn đặt tên nó như Giờ sau đó, Bây giờ cho việc này bạn có thể thêm dòng này trong mã trên,

csv_input['New Value'] = csv_input['Hours'] 

hoặc đơn giản là chúng ta có thể, mà không cần thêm cột dẫn sử dụng, chúng ta có thể

csv_input['New Value'] = '' #simple and easy 

Tôi hy vọng điều đó sẽ hữu ích.

Các vấn đề liên quan