2011-08-24 160 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關於你的代碼體的內容 –