如何用Python替换CSV文件中的列?

时间:2009-07-21 14:23:23

标签: python csv

我有2个csv文件。我需要用一个来自另一个文件的列替换一个文件中的列,但是它们必须根据ID列保持排序。

以下是一个例子:

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          

基本上我用正确的90mdist创建了一个新文件,我需要将它插入到旧文件中,但它必须与相同的ID#排成一行。

我的理解是Python将csv文件视为字符串。所以我可以使用字典或将数据转换为列表然后更改它?哪种方式最好?

任何帮助将不胜感激!!

4 个答案:

答案 0 :(得分:7)

Python库中的CSV Module就是您需要的。

它允许您读取和写入CSV文件,处理行元组或项目列表。

只需使用更正后的值读入文件,请将其存储在以该行ID标识的字典中。

然后读入第二个文件,用dict中的数据替换相关列,并写出第三个文件。

完成。

答案 1 :(得分: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。

答案 2 :(得分: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']]

答案 3 :(得分:0)

如果你只是一次性这样做,为什么还要烦扰Python呢? Excel或OpenOffice Calc将为您打开两个CSV文件,然后您可以将列从一个剪切并粘贴到另一个。

如果两个ID列表不完全相同,那么一个简单的VB宏就可以为你完成。