0

スプレッドシートから直接読み取った情報の行を読み取り/印刷する次のコードがあります。

in_path = connector.GetWorksheetDataWithId(worksheet_id)

# Simple test print

for item in in_path:
    print item

次の形式の複数の行が印刷されます。

{'_chk2m': 'Name1@domain.com', '_cn6ca': 'PaulDu', '_cokwr': '005C0000003yL'}
{'_chk2m': 'Name2@domain.com', '_cn6ca': 'Jeanell', '_cokwr': '005C0000003we'}
{'_chk2m': 'Name3@domain.com', '_cn6ca': 'Twanna', '_cokwr': '005C0000004tB'}
{'_chk2m': 'Name4@domain.com', '_cn6ca': 'JaneyD', '_cokwr': '005C0000003xJ}
{'_chk2m': 'Name5@domain.com', '_cn6ca': 'Charlot', '_cokwr': '005C0000003yS}
{'_chk2m': 'Name6@domain.com', '_cn6ca': 'Janessa', '_cokwr': '005C0000004pE'}
{'_chk2m': 'Name7@domain.com', '_cn6ca': 'Matilda', '_cokwr': '005C000  0003xK'}
{'_chk2m': 'Name8@domain.com', '_cn6ca': 'ChloeR', '_cokwr': '005C00000040h'}

ユーザーにユーザー エイリアス (行の 2 番目の項目、たとえば「PaulDu」) を送信させ、ID # を返してもらいます (行の 3 番目の項目)。

私はこのようなことを試しました:

def dict_test(in_path):
    user_alias = raw_input("Please enter User Alias: ")
    for row in in_path:

        if (user_alias in elt for elt in row):
            return user_alias
            print row

dict_test(in_path)

「PaulDu」と入力しましたが、どの行も正常に印刷できませんでした。また、現在識別されている行からメールを呼び出すにはどうすればよいですか?


編集:

最終的な作業コード:

in_path = connector.GetWorksheetDataWithId(worksheet_id)

def dict_test(in_path):
    user_alias = raw_input("Please enter User Alias: ")
    data = []
    for row in in_path:

        #if any(user_alias in row[elt] for elt in row):
        #if any(user_alias in value for key, value in row.items()):
        if user_alias in row.values():
            print row


    for row in in_path:
        if user_alias == row['_cn6ca']:
                email = row['_chk2m']
                print email
                return email

dict_test(in_path)
4

3 に答える 3

0

の項目in_pathは辞書ですか? その場合、辞書構文を使用できます。

def dict_test(in_path):
    user_alias = raw_input("Please enter User Alias: ")
    for row in in_path:
        if row['_cn6ca'] == user_alias:
            print row
            return row['_cokwr']

returnはすぐに関数を終了するので、何かを表示したい場合はprint前に置く必要があります。

于 2013-10-14T22:17:18.320 に答える
0

そんな感じ?(キーを知っていると仮定して、必要なフィールドを抽出できる一致した行を返します。)

   def dict_test(in_path):
        user_alias = raw_input("Please enter User Alias: ")
        for row in in_path:
            if (row['_cn6ca'] == user_alias ):
                return row

    my_row = dict_test(in_path)
    id = my_row['_cokwr']
    email = my_row['_chk2m']
于 2013-10-14T22:18:25.010 に答える
0

まず、ファイルを検索する前に…</p>

名前in_pathは、それがパス名であることを意味します。もしそうなら、この行:

for row in in_path:

… その名前のファイルの内容ではなく、そのパス名の文字をループするだけです。ファイルを読みたい場合は、それをしなければなりませんopen。このような:

with open(in_path) as in_file:
    for row in in_file:

このような問題をデバッグする最初のステップはprint、中間値を出力することです。eachをprint編集するrowと、これが機能しなかった理由がすぐに明らかになります。


次に、この行にはいくつかの問題があります。

if (user_alias in elt for elt in row):

まず、 のrowように見えます。これは、そのキーを提供dictすることを意味しfor elt in rowますが、その値を検索しようとしています。

第 2 に、ジェネレーター内のいずれかの要素が true であるかどうかを確認したいときに、常に true であるジェネレーターの真理値をチェックしています。そのためには、any関数を使用します。

おそらくあなたが望んでいたのは、次のいずれかのようなものでした。

if any(user_alias in row[elt] for elt in row):
if any(user_alias in value for key, value in row.items()):

また、本当に部分文字列を探していますか? あなたの例は完全に一致しており、あなたの説明から、それはより合理的に聞こえます。その場合、次のように書くことができます:

if user_alias in row.values():

その間:

また、現在識別されている行からメールを呼び出すにはどうすればよいですか?

あなたのコードは、あなたがキーを知らないことを暗示しています。つまり、あなたができる唯一のことは、見つかった行の値を調べて、電子メール アドレスに最も似ているものをヒューリスティックに見つけることです。

キーを知っていればこれはずっと簡単です。

if user_alias == row['_cn6ca']:
    email = row['_chk2m']
于 2013-10-14T22:12:43.220 に答える