2012-11-29 33 views
2

下面的代碼應該從文件Dict_file中查找第一列(關鍵字),並將另一個文件fr的第一列替換爲從dict_file找到的關鍵字的值。但它保留dict_file作爲未來查找的更新字典。從文件填充字典的Python Noob問題。然後更新字典並寫回文件

每次運行代碼時,它都會從該dict_file文件初始化字典。如果它從另一個文件中找到新的電子郵件地址,它會將其添加到dict_file的底部。

根據我的理解,它應該可以正常工作,因爲如果找不到@符號,它會爲「[email protected]」的值分配looking_for。[email protected]應該被添加到dict_file的底部。

但由於某些原因,我一直在dict_file的末尾添加新行和空行以及其他新電子郵件。我不能在dict_file的末尾寫空白和換行符。

這是怎麼發生的?下面的代碼有什麼錯誤,我的大腦即將爆炸!任何幫助將不勝感激!

#!/usr/bin/python 

import sys 

d = {} 
line_list=[] 
alist=[] 

f = open(sys.argv[3], 'r') # Map file 

for line in f: 
    alist = line.split() 
    key = alist[0] 
    value = alist[1] 
    d[str(key)] = str(value) 
    alist=[] 
f.close() 

fr = open(sys.argv[1], 'r') # source file 

fw = open(sys.argv[2]+"/masked_"+sys.argv[1], 'w') # target file 

for line in fr: 
    columns = line.split("|") 
    looking_for = columns[0] # this is what we need to search 
    if looking_for in d: 
     # by default, iterating over a dictionary will return keys 
     if not looking_for.find("@"): 
      looking_for == "[email protected]" 
      new_line = d[looking_for]+'|'+'|'.join(columns[1:]) 
      line_list.append(new_line) 
     else: 
      new_line = d[looking_for]+'|'+'|'.join(columns[1:]) 
      line_list.append(new_line) 
    else: 
     new_idx = str(len(d)+1) 
     d[looking_for] = new_idx 
     kv = open(sys.argv[3], 'a') 
     kv.write("\n"+looking_for+" "+new_idx) 
     kv.close() 
     new_line = d[looking_for]+'|'+'|'.join(columns[1:]) 
     line_list.append(new_line) 
fw.writelines(line_list) 

這裏是dict_file:

[email protected] 223 
[email protected] 224 
[email protected] 225 
[email protected] 226 
[email protected] 227 

這裏是FR文件得到第一列變成了ID從dict_file查找:

[email protected]|12|1|GDSP 
[email protected]|13|7|GDFP 
[email protected]|12|1|GDOP 
[email protected]|132|1|GUIP 
MONITOR|132|1|GUIP 
    |132|1|GUIP 
00 |12|34|GUILIGAN 
+1

刺在黑暗中,因爲我沒有你的輸入文件看,但嘗試更換'ALIST = line.split()'和'ALIST = line.strip()分裂。 ()'和'columns = line.split('|')''列= line.strip()。split('|')'。 – zwol

+0

Python允許你將第一部分寫成'with open(sys.argv [3],'r')作爲f:d.update(dict(line.split(),用於f中的line))':) –

+0

I添加了dict_file以及上面的fr文件。請看一下..鏈接strip()方法不會改變程序結果。如果找到新的電子郵件地址,我只想在dict_file中存儲,只檢查是否包含「@」符號。如果沒有,它不應該被添加到dict_file – user836087

回答

4

首先,您需要忽略初始字典讀取中的空白,否則當您再次運行此腳本時,您將得到一個超出範圍錯誤的索引。當您通過fr對象讀取以避免輸入空值時,請做同樣的事情。將您的電子郵件檢查條件進一步包裝以獲得更大範圍。使用find方法對「@」進行簡單檢查。你很好走。

請嘗試以下操作。這應該工作:

#!/usr/bin/python 

import sys 

d = {} 
line_list=[] 
alist=[] 
f = open(sys.argv[3], 'r') # Persisted Dictionary File 

for line in f: 
    line = line.strip() 
    if line =="": 
     continue 
    alist = line.split() 
    key = alist[0] 
    value = alist[1] 
    d[str(key)] = str(value) 
    alist=[] 
f.close() 

fr = open(sys.argv[1], 'r') # source file 
fw = open(sys.argv[2]+"/masked_"+sys.argv[1], 'w') # Target Directory Location 

for line in fr: 
    line = line.strip() 
    if line == "": 
     continue 
    columns = line.strip().split('|') 
    if columns[0].find("@") > 1: 
     looking_for = columns[0] # this is what we need to search 
    else: 
     looking_for = "[email protected]" 
    if looking_for in d: 
     # by default, iterating over a dictionary will return keys 
      new_line = d[looking_for]+'|'+'|'.join(columns[1:]) 
      line_list.append(new_line) 
    else: 
     new_idx = str(len(d)+1) 
     d[looking_for] = new_idx 
     kv = open(sys.argv[3], 'a') 
     kv.write(looking_for+" "+new_idx+'\n') 
     kv.close() 
     new_line = d[looking_for]+'|'+'|'.join(columns[1:]) 
     line_list.append(new_line) 
fw.writelines(line_list) 
+1

謝謝。這完美的作品! – user836087