Python CSV模块同时读写

时间:2011-08-24 20:39:05

标签: python csv

我有两个.csv文件我在一个(文件a)中查找数据并将其与另一个(文件b)匹配一旦我找到b中的相应行我想写入相应行中的特定单元格。另外我需要迭代这个,所以我可能会多次写入文件b中的每一行。

我可以写一个csv文件然后一遍又一遍地读它吗?

def match(name, group, cnum):
  for data in masterfile_list:
    if (name in data[0]):
        if (group in data[4]):
            if (cnum == "112"):
                data[7] = cnum
            elif (cnum == "111"):
                data[8] = cnum
            elif (cnum == "110"):
                data[9] = cnum
            elif (cnum == "109"):
                data[10] = cnum
            elif (cnum == "108"):
                data[11] = cnum
            elif (cnum == "107"):
                data[12] = cnum
            elif (cnum == "106"):
                data[13] = cnum
            elif (cnum == "105"):
                data[14] = cnum
            elif (cnum == "104"):
                data[15] = cnum
            elif (cnum == "103"):
                data[16] = cnum
            elif (cnum == "102"):
                data[17] = cnum
            elif (cnum == "101"):
                data[18] = cnum 

理想情况下,我会写/替换匹配的行。

3 个答案:

答案 0 :(得分:2)

如果文件b不是非常大,我建议使用readlines()获取所有行的列表,然后迭代列表并根据需要更改行。这比寻找文件中的不同位置和替换行要容易得多。

此外,您可以显着减少函数体中的代码,我可能会这样做:

def match(name, group, cnum):
    lookup = dict(zip(map(str, range(112, 100, -1)), range(7, 19)))
    for data in masterfile_list:
        if name in data[0] and group in data[4] and cnum in lookup:
            data[lookup[cnum]] = cnum

答案 1 :(得分:1)

我不确定您的代码片段是如何打开/读取/写入有问题的文件的。

要做你想要的描述,如果文件不是太大,我会把相关的源文件读入内存,改变你需要在内存中的结构,然后把结果写出来。

伪代码

file_a=open('file_a','r')
file_b_things=open('file_b','r').readlines()

new_things_file=open('new_things','w')
new_things=[]

for thing in file_a:
    if thing in file_b_things:
      new_thing=do_something_with(thing)
      new_things.append(new_thing)

for new_thing in new_things:
  new_things_file.write(new_thing)

答案 2 :(得分:0)

更换文件中的行通常并不容易。通常,如果要进行更改,则必须重写文件(以安全的方式)。

除非您确切知道线条大小不会改变,否则您可以在阅读一行之前ftell(),然后再seek()。但即使这样也不太安全,因为python中的readline()内容会做一些缓冲,即文件指针比它应该更接近结束。