2009-07-21 48 views
5

Tôi có 2 tệp csv. Tôi cần phải thay thế một cột trong một tệp bằng một cột từ tệp khác nhưng chúng phải được sắp xếp theo cột ID.Làm cách nào để thay thế một cột trong tệp CSV bằng Python?

Dưới đây là một ví dụ:

file1:

ID, transect, 90mdist          
1, a, 10,             
2, b, 20,             
3, c, 30,  

file2:

ID, transect, 90mdist         
1, a, 50             
2, b, 70              
3, c, 90   

về cơ bản tôi đã tạo một file mới với 90mdist chính xác và tôi cần phải chèn nó vào file cũ nhưng nó phải xếp hàng với cùng một ID #.

Đó là sự hiểu biết của tôi rằng Python xử lý tệp csv dưới dạng chuỗi. vì vậy tôi có thể sử dụng một từ điển hoặc chuyển đổi dữ liệu vào một danh sách và sau đó thay đổi nó? cách nào là tốt nhất?

Bất kỳ trợ giúp nào sẽ được đánh giá cao !!

+0

trong ví dụ bạn tệp 2 đã được sửa chữa tệp, phải không? để bạn có thể đổi tên tệp. – SilentGhost

+0

Vì hai tệp có cùng một bộ giá trị ID và cột bạn có nghĩa là bạn muốn ghi đè toàn bộ giá trị đầu tiên với cột thứ hai? Tôi không chắc chắn những gì bạn có nghĩa là bằng cách 'chèn' sau đó - có thể dữ liệu ví dụ là xấu chọn và bạn có thể chỉnh sửa để làm rõ (mong muốn đầu ra cũng như đầu vào)? –

+0

chính xác sao chép http://stackoverflow.com/questions/1019200/how-to-replace-a-column-using-pythons-built-in-csv-writer-module – SilentGhost

Trả lời

7

CSV Module trong Thư viện Python là những gì bạn cần tại đây.

Nó cho phép bạn đọc và ghi tệp CSV, xử lý các dòng một bộ hoặc danh sách các mục.

Chỉ cần đọc trong tệp có giá trị được sửa, lưu trữ trong từ điển được khóa bằng ID của dòng.

Sau đó đọc trong tệp thứ hai, thay thế cột có liên quan bằng dữ liệu từ dict và ghi vào tệp thứ ba.

Xong.

+0

Đánh tôi với cú đấm. –

+2

+1: Viết vào tập tin thứ ba. Đừng cố gắng cập nhật một tệp tại chỗ. –

0

Khi bạn có danh sách csv, một cách dễ dàng để thay thế cột trong một ma trận bằng một ma trận khác sẽ chuyển đổi ma trận, thay thế hàng và sau đó chuyển lại ma trận đã chỉnh sửa của bạn. Dưới đây là ví dụ về dữ liệu của bạn:

csv1 = [['1', 'a', '10'], ['2', 'b', '20'], ['3', 'c', '30']] 
csv2 = [['1', 'a', '50'], ['2', 'b', '70'], ['3', 'c', '90']] 

# transpose in Python is zip(*myData) 
transposedCSV1, transposedCSV2 = zip(*csv1), zip(*csv2) 
print transposedCSV1 
>>> [['1', '2', '3'], ['a', 'b', 'c'], ['10', '20', '30']] 

csv1 = transposedCSV1[:2] + [transposedCSV2[2]] 
print csv1 
>>> [['1', '2', '3'], ['a', 'b', 'c'], ['50', '70', '90']] 

csv1 = zip(*csv1) 
print csv1 
>>> [['1', 'a', '50'], ['2', 'b', '70'], ['3', 'c', '90']] 
0

Nếu bạn chỉ thực hiện thao tác này một lần, tại sao bạn bận tâm với Python? Excel hoặc OpenOffice Calc sẽ mở hai tệp CSV cho bạn, sau đó bạn chỉ có thể cắt và dán cột từ cột này sang cột khác.

Nếu hai danh sách ID không chính xác giống nhau thì macro VB đơn giản sẽ làm điều đó cho bạn.

2

Hãy thử điều này:

from __future__ import with_statement 

import csv 

def twiddle_csv(file1, file2): 
    def mess_with_record(record): 
     record['90mdist'] = 2 * int(record['90mdist']) + 30 
    with open(file1, "r") as fin: 
     with open(file2, "w") as fout: 
      fields = ['ID', 'transect', '90mdist'] 
      reader = csv.DictReader(fin, fieldnames=fields) 
      writer = csv.DictWriter(fout, fieldnames=fields) 
      fout.write(",".join(fields) + '\n') 
      reader.next() # Skip the column header 
      for record in reader: 
       mess_with_record(record) 
       writer.writerow(record) 

if __name__ == '__main__': 
    twiddle_csv('file1', 'file2') 

Một vài số khó khăn:

  • DictReader dường như sử dụng hàng đầu tiên như dữ liệu, thậm chí nếu nó phù hợp với lĩnh vực. Gọi reader.next() để bỏ qua.
  • Hàng dữ liệu không thể có dấu phẩy theo sau. Chúng sẽ được hiểu là các cột trống.
  • DictWriter không xuất hiện để viết ra các tiêu đề cột. DIY.
+0

Cảm ơn bạn đã lấy mẫu. (Ít nhất là đối với csv.reader và csv.writer) mô-đun python csv yêu cầu bạn phải ** mở các tệp ở chế độ nhị phân ** hoặc bạn sẽ nhận được các dòng mới vô tình (xem http://bugs.python.org/issue7198). –

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