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

首先,在您开始搜索文件之前……</p>

该名称in_path暗示它是一个路径名。如果是这样,这一行:

for row in in_path:

…只是要遍历该路径名的字符,而不是该名称的文件内容。如果你想读一个文件,你必须读open它。像这样:

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

调试此类问题的第一步是print找出中间值。如果您printed each row,那么为什么这不起作用将立即显而易见。


接下来,这条线有几个问题:

if (user_alias in elt for elt in row):

首先,row似乎是 a dict,这意味着for elt in row它将为您提供其键,但您正在尝试搜索其值。

其次,当您想要检查生成器中的任何元素是否为真时,您正在检查生成器的真值,该值始终为真。为此,请使用该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 回答
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 回答