2011-08-24 154 views
0

我有我的一个(文件)查找数据,并将其匹配到其他的(文件B)一旦我找到合适的排在B我想写两个文件的.csv适当行中的特定单元格。另外我需要迭代这个,所以我可能会多次写入文件b中的每一行。Python的CSV模块同时读写

我可以写一个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 

我会理想地写/替换匹配的行。

回答

0

它一般不容易在一个文件替换线。通常,如果要进行更改,则必须重新编写该文件(以安全的方式)。

除非您确切知道线条大小不会改变 - 那么您可以在ftell()之后再阅读一条线,然后在seek()之后。但即使这样,是不是很安全的,因为readline()东西在Python做一些缓冲,即文件指针是接近年底比它应该是。

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 
+0

我很抱歉,但我是新来这个。如果使用readline – jimstandard1029

+0

@ jimstandard1029,我仍然可以使用CSV模块:通常,不,您不会将'csv'模块与'readlines()'一起使用。但是,首先将所有数据读入内存的建议仍然存在。取而代之的阅读完所有的线一次(如'readlines方法()'一样),你会遍历所有行(通过'csv'模块)。在你的“文件b”的情况下,你应该继续前进,遍历整个事情,在执行任何查找之前,将所有内容全部加载到内存中。然后,在完成计算之前,不要写出任何内容,并在此时写出所有内容。 –

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) 
+0

以及F.J关于你的代码体的内容 –