2

以下のコードは、ファイルから最初の列 (キー) を検索し、別のファイルの最初の列をから見つかったキーの値にDict_file置き換えることになっています。ただし、将来の検索のために更新された辞書として保持されます。frdict_filedict_file

コードが実行されるたびに、その dict_file ファイルから辞書が初期化されます。別のファイルから新しい電子メール アドレスが見つかった場合は、それを dict_file の末尾に追加します。

私の理解によれば、@ 記号が見つからない場合は「Dummy@dummy.com」の値を looking_for に割り当てるため、正常に動作するはずです.. Dummy@dummy.com を 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 == "Dummy@dummy.com"
            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 は次のとおりです。

WHATEmail@SIMPLE.COM    223
SamHugan@CR.COM 224
SAMASHER@CATSTATIN.COM  225
FAKEEMAIL@SLOW.com  226
SUPERMANN@MYMY.COM 227

dict_file ルックアップから最初の列を id に変換する fr ファイルを次に示します。

WHATEmail@SIMPLE.COM|12|1|GDSP
FAKEEMAIL@SLOW.com|13|7|GDFP
MICKY@FAT.COM|12|1|GDOP
SUPERMANN@MYMY.COM|132|1|GUIP
MONITOR|132|1|GUIP
    |132|1|GUIP
00 |12|34|GUILIGAN
4

1 に答える 1

4

最初に、最初に読み取った辞書で空白を無視する必要があります。そうしないと、このスクリプトを再度実行したときに、範囲外のインデックス エラーが発生します。null の入力を避けるために、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 = "Dummy@dummy.com"
    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)
于 2012-11-29T06:13:49.077 に答える