3

私はPythonとプログラミングが初めてです。Python スクリプトのヘルプが必要です。メールアドレスを含むファイルが 2 つあります (5000 行以上)。入力ファイルには、データ ファイルで検索したいメール アドレスが含まれています (メール アドレスも含まれています)。次に、出力をファイルに出力するか、コンソールに表示します。スクリプトを検索して変更できましたが、目的の結果が得られません。手伝ってくれませんか?

dfile1 (50K lines)
yyy@aaa.com
xxx@aaa.com
zzz@aaa.com


ifile1 (10K lines)
ccc@aaa.com
vvv@aaa.com
xxx@aaa.com
zzz@aaa.com

Output file
xxx@aaa.com
zzz@aaa.com



datafile = 'C:\\Python27\\scripts\\dfile1.txt'
inputfile = 'C:\\Python27\\scripts\\ifile1.txt'

with open(inputfile, 'r') as f:
names = f.readlines()

outputlist = []

with open(datafile, 'r') as fd:
  for line in fd:
    name = fd.readline()
    if name[1:-1] in names:
        outputlist.append(line)
    else:
        print "Nothing found"
 print outputlist

新しいコード

with open(inputfile, 'r') as f:
    names = f.readlines()
outputlist = []

with open(datafile, 'r') as f:
    for line in f:
        name = f.readlines()
        if name in names:
            outputlist.append(line)
        else:
            print "Nothing found"
    print outputlist
4

5 に答える 5

1

I think your issue stems from the following:

name = fd.readline()
if name[1:-1] in names:

name[1:-1] slices each email address so that you skip the first and last characters. While it might be good in general to skip the last character (a newline '\n'), when you load the name database in the "dfile"

with open(inputfile, 'r') as f:
    names = f.readlines()

you are including newlines. So, don't slice the names in the "ifile" at all, i.e.

if name in names:
于 2013-11-12T16:01:54.923 に答える
1

name = fd.readline()forループにすでに行があるので、削除できると思います。毎回 1 行を読み取る for ループに加えて、別の行を読み取ります。また、検索時に最初と最後の文字を取り除きたくないので、そうname[1:-1]あるべきだと思います。開いているファイルを自動的に閉じます。namewith

PS:私はそれを行う方法:

with open("dfile1") as dfile, open("ifile") as ifile:
    lines = "\n".join(set(dfile.read().splitlines()) & set(ifile.read().splitlines())
print(lines)
with open("ofile", "w") as ofile:
    ofile.write(lines)

上記のソリューションでは、基本的に、両方のファイルの行の結合 (両方のセットの要素の一部) を使用して、共通の行を見つけています。

于 2013-11-12T15:58:15.717 に答える