2

このコードは、2つのテキストファイルを開いて読み取り、両方に単語が存在する場合に一致する必要があります。一致は、「SUCESS」を印刷し、その単語をtemp.txtファイルに書き込むことで表されます。

dir = open('listac.txt','r')
path = open('paths.txt','r')
paths = path.readlines()
paths_size = len(paths)
matches = open('temp.txt','w')
dirs = dir.readlines()

for pline in range(0,len(paths)):
        for dline in range(0,len(dirs)):
                p = paths[pline].rstrip('\n').split(".")[0].replace(" ", "")
                dd = dirs[dline].rstrip('\n').replace(" ", "")
                #print p.lower()
                #print dd.lower()
                if (p.lower() == dd.lower()):
                        print "SUCCESS\n"
                        matches.write(str(p).lower() + '\n')

listac.txtは次のようにフォーマットされます

/teetetet
/eteasdsa
/asdasdfsa
/asdsafads
.
. 
...etc

path.txtは次のようにフォーマットされます

/asdadasd.php/asdadas/asdad/asd
/adadad.html/asdadals/asdsa/asd
.
.
...etc

したがって、ドットの前の最初の/ asadasda(paths.txt内)を取得するために、split関数を使用します。問題は、単語が一致していないように見えることです。各IFステートメントの前に各比較を出力しましたが、それらは等しいです。文字列を比較する前にPythonが行うことは他にありますか?

=======

助けてくれてありがとう。あなたが提案したように、私はコードをクリーンアップしたので、次のようになりました:

dir = open('listac.txt','r')
path = open('paths.txt','r')
#paths = path.readlines()
#paths_size = len(paths)

for line in path:
        p = line.rstrip().split(".")[0].replace(" ", "")
        for lines in dir:
                d = str(lines.rstrip())
                if p == d:
                        print p + " = " + d

どうやら、2番目のforループに入る前にpを宣言して初期化すると、将来の比較に違いが生じます。2番目のforループ内でpとdを宣言すると、機能しませんでした。その理由はわかりませんが、誰かが知っているなら、私は聞いています:)

再度、感謝します!

4

2 に答える 2

7

とにかくデータファイル全体をメモリに読み込んでいますsetsが、交差点を使用して取得してみませんか?:

def format_data(x):
    return x.rstrip().replace(' ','').split('.')[0].lower()

with open('listac.txt') as dirFile:
     dirStuff = set( format_data(dline) for dline in dirFile )

with open('paths.txt') as pathFile:
     intersection = dirStuff.intersection( format_data(pline) for pline in pathFile )

for elem in intersection:
    print "SUCCESS\n"
    matches.write(str(elem)+"\n")

見た目はほぼ同じなので、両方のデータセットに同じformat_data関数を使用しましたが、必要に応じて複数の関数を使用できます。また、このソリューションは 2 つのファイルのうち 1 つだけをメモリに読み込むことに注意してください。他の部分との交差は、遅延して計算する必要があります。

コメントで指摘されているように、これは順序を維持しようとはしません。ただし、順序を維持する必要がある場合は、次のようにしてください。

<snip>
...
</snip>

with open('paths.txt') as pathFile:
    for line in pathFile:
        if format_line(line) in dirStuff:
           print "SUCCESS\n"
           #...
于 2012-09-11T14:55:57.450 に答える
4

一致が得られない理由を確認するには、データ セットをもっと見る必要があります。コードの一部をよりpythonicにリファクタリングしました。

dirFile = open('listac.txt','r')
pathFile = open('paths.txt','r')
paths = pathFile.readlines()
dirs = dirFile.readlines()

matches = open('temp.txt','w')

for pline in paths:
    p = pline.rstrip('\n').split(".")[0].replace(" ", "")
    for dline in dirs:
        dd = dline.rstrip('\n').replace(" ", "")
        #print p.lower()
        #print dd.lower()
        if p.lower() == dd.lower():
            print "SUCCESS\n"
            matches.write(str(p).lower() + '\n')
于 2012-09-11T14:50:32.757 に答える