2015-06-01 134 views
1

我想解析2管/逗號分隔文件,如果特定的字段匹配在文件中創建第三個文件中的新條目。在python解析文件

如下代碼:

#! /usr/bin/python 

fo = open("c-1.txt" , "r") 
for line in fo: 
    #print line 
    fields = line.split('|') 
    src = fields[0] 

    f1 = open("Airport.txt", 'r') 
    f2 = open("b.txt", "a") 
    #with open('c.csv', 'r') as f1: 
    # line1 = f1.read() 
    for line1 in f1: 
     reader = line1.split(',') 
     hi = False 
     target = reader[0] 
     if target == src and fields[1] == 'ZHT': 
      print target 
      hi = True 
      f2.write(fields[0]) 
      f2.write("|") 
      f2.write(fields[1]) 
      f2.write("|") 
      f2.write(fields[2]) 
      f2.write("|") 
      f2.write(fields[3]) 
      f2.write("|") 
      f2.write(fields[4]) 
      f2.write("|") 
      f2.write(fields[5]) 
      f2.write("|") 
      f2.write(reader[2]) 
    if hi == False: 
     f2.write(line) 
    f2.close() 
    f1.close() 
fo.close() 

匹配字段被在新文件中的印刷2次。可能是什麼原因?

+0

你能顯示你的輸入和願望輸出嗎? – Kasramvd

+0

順便說一下,最好使用'open(「c-1.txt」,「r」)作爲fo:',那麼你不需要明確關閉。 –

+0

確保你標記的答案是正確的,以便將來看這個的人知道什麼有幫助! – Scironic

回答

2

問題似乎是,您在每次迭代循環中將hi重置爲False。讓我們說第二行匹配,但第三行不匹配。您在第二行設置了hiTrue,然後在第三行再次到False,然後打印出原始的line

嘗試這樣的:

hi = False 
for line1 in f1: 
    reader = line1.split(',') 
    target = reader[0] 
    if target == src and fields[1] == 'ZHT': 
     hi = True 
     f2.write(stuff) 
if hi == False: 
    f2.write(line) 

或者,假設只有一行將永遠匹配,你可以使用for/else

for line1 in f1: 
    reader = line1.split(',') 
    target = reader[0] 
    if target == src and fields[1] == 'ZHT': 
     f2.write(stuff) 
     break 
else: 
    f2.write(line) 

另外請注意,你很可能取代該系列的f2.write聲明通過這個,加入了幾個部分|

f2.write('|'.join(fields[0:6] + [reader[2]]) 
2

正如已經提到的那樣,您在循環中重置標誌,因此可能會打印多行。

如果確實只有一行匹配,那麼找到該行後可能會打破循環。

最後檢查您的數據以確保沒有相同的匹配行。

除此之外,我有一對夫婦的其他建議清理你的代碼,使其更容易調試:

1)使用csv庫。 2)如果文件可以保存在內存中,最好將它們保存在內存中而不是不斷地打開和關閉它們。

3)使用with來處理文件(我不是你已經在你的評論中嘗試過)。

像下面這樣的東西應該工作。

#! /usr/bin/python 

import csv 

data_0 = {} 

data_1 = {} 

with open("c-1.txt" , "r") as fo, open("Airport.txt", "r") as f1: 

    fo_reader = csv.reader(fo, delimiter="|") 

    f1_reader = csv.reader(f1) # default delimiter is ',' 

    for line in fo_reader: 

     if line[1] == 'ZHT': 
      try: # Add to a list here in case keys are duplicated. 
       data_0[line[0]].append(line) 
      except KeyError: 
       data_0[line[0]] = [line] 

    for line in f1_reader: 
     data_1[line[0]] = line[2] # We only need the third column of this row to append to the data. 

with open("b.txt", "a") as f2: 

    writer = csv.writer(f2, delimiter="|") # I would be tempted to not make this a pipe, but probably too late already if you've got a pre-made file. 

    for key in data_0: 
     if key in data_1.keys(): 
      for row in data_0[key]: 
       writer.writerow(row[:6]+data_1[key]) # index to the 6th column, and append the data from the other file. 
     else: 
      for row in data_0[key]: 
       writer.writerow(row) 

這應該避免有額外的行以及沒有真/假標誌依靠。