2009-07-21 61 views
5

我有2個csv文件。我需要將一個文件中的列替換爲另一個文件中的列,但他們必須根據ID列進行排序。如何在Python中替換CSV文件中的列?

下面是一個例子:

文件1:

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

文件2:

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

基本上我創建了正確的90mdist一個新的文件,我需要將其插入到舊的文件但它必須符合相同的ID#。

這是我的理解,Python將csv文件視爲一個字符串。所以我可以使用字典或將數據轉換爲列表然後更改它?哪種方式最好?

任何幫助將不勝感激!

+0

在你的例子file2已經更正的文件,不是嗎?所以你可以重命名文件。 – SilentGhost 2009-07-21 14:25:23

+0

由於這兩個文件具有相同的一組ID值和列,你是否想要用第二個文件完全覆蓋第一個文件?我不確定'插入'是什麼意思 - 也許這個例子中的數據選擇不當,你可以編輯來澄清(期望的輸出以及輸入)? – 2009-07-21 14:28:09

+0

確切複製http://stackoverflow.com/questions/1019200/how-to-replace-a-column-using-pythons-built-in-csv-writer-module – SilentGhost 2009-07-21 15:11:48

回答

7

Python庫中的CSV Module是您在這裏需要的。

它允許您讀取和寫入CSV文件,處理行元組或項目列表。

只需在帶有更正值的文件中讀取,將其存儲在用該行ID標識的字典中。

然後在第二個文件中讀取,用dict中的數據替換相關列並寫入第三個文件。

完成。

0

一旦你有你的csv列表,一個簡單的方法來替換一個矩陣中的列與另一個將是轉置矩陣,替換行,然後轉置回編輯矩陣。以下是您的數據示例:

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

如果您只是將其作爲一次性使用,爲什麼還要使用Python? Excel或OpenOffice Calc將爲您打開兩個CSV文件,然後您可以將列從一個切換到另一個。

如果兩個ID列表不完全相同,那麼一個簡單的VB宏會爲你做。

2

試試這個:

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') 

需要注意幾個問題:

  • DictReader似乎使用的第一行 數據,即使它的 領域相匹配。調用reader.next()跳過。
  • 數據行不能有尾隨逗號。他們將被解釋爲空欄。
  • DictWriter似乎沒有寫出列標題。 DIY。