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

5 投票
4 回答
9282 浏览
提问于 2025-04-15 13:03

我有两个csv文件。我需要把一个文件中的某一列替换成另一个文件中的一列,但它们必须根据一个ID列保持排序。

这里有个例子:

文件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文件当作字符串来处理。所以我可以使用字典,或者把数据转换成列表,然后再进行修改?哪种方法更好呢?

任何帮助都会非常感谢!!

4 个回答

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']]
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 似乎不会自动写出列标题。需要自己手动添加。
7

这里你需要用到的是Python库中的CSV模块

这个模块可以让你读取和写入CSV文件,把每一行当作一个元组或者列表来处理。

首先,读取包含正确值的文件,把这些值存储在一个字典里,字典的键是每一行的ID。

接着,读取第二个文件,用字典中的数据替换相关的列,然后把结果写入第三个文件。

就这样完成了。

撰写回答