0

検索項目のリストがあります:

search = ("EPP3424", "EPP5423", "EPP4567", Continues... )

各行が次のようになっているcsvファイルの各行を確認したいと思います。

("1206502", "EPP5423", "97334343")
next row...

検索リストの項目のいずれかがcsvの行に表示されている場合は、その行全体を新しいリストに追加します。

問題は、1つの結果にしか一致させられないことです。アイテムを正しくループさせることができないようです。

csvFile = open(fRoot + "\\SearchEPP.csv", 'r')
try:
    csvReader = csv.reader(csvFile)
    for row in csvReader:
        if all(s in row for s in search):
            print "Match"
            allEPP.append(row)
        else:
            print "no match"
finally:
    csvFile.close()

Python 2.6、Windows 7

アップデート:

これがあなたの応答に基づいて私がやろうとしたことですが、それでも1つのレコードしか返しません。

f = open(fRoot + "\\EPP.txt", "r")

search = list()
for row in f:
    search.append(row)

search = set(search)   

#search = ("EPP2383", "EPP2384")

allEPP = list()

csvFile = open(fRoot + "\\SearchEPP.csv", 'r')
try:
    csvReader = csv.reader(csvFile)
    for row in csvReader:
        if any(r in search for r in row):
            print "Match"
            allEPP.append(row)
        else:
            print "."
finally:
    csvFile.close()
4

1 に答える 1

3
if all(s in row for s in search):

おそらく次のようになります。

if any(s in row for s in search):

これを行うためのより良い方法はsearch、一度セットに変換することであることに注意してください。

search = set(search)
...

set次に、 (の代わりに)をチェックしますtuple。のメンバーシップテストsetは通常​​O(1)ですが、タプルのメンバーシップテストはO(n)です。

if any(r in search for r in row):

あるいは:

if search.intersection(row):
   ...

any解決策はより速いかもしれませんrowが(交差を介して新しいセットを作成するオーバーヘッドとジェネレータ式のオーバーヘッドの大きさによって異なります)。


@RocketDonkeyによって提案されているように、「検索」リストに改行が含まれている可能性がありますが、それでも更新されたコードで問題が発生しています。これが1つの修正です:

with open(fRoot + "\\EPP.txt", "r") as f:
    search = set(line.rstrip('\n') for line in f)
于 2012-11-05T15:49:16.860 に答える