2013-10-14 29 views
0

我有下面的代码读取/直接从电子表格中读取信息的打印行:按以下格式如何查找某一个项目在一个特定的行

in_path = connector.GetWorksheetDataWithId(worksheet_id) 

# Simple test print 

for item in in_path: 
    print item 

多行打印:

{'_chk2m': '[email protected]', '_cn6ca': 'PaulDu', '_cokwr': '005C0000003yL'} 
{'_chk2m': '[email protected]', '_cn6ca': 'Jeanell', '_cokwr': '005C0000003we'} 
{'_chk2m': '[email protected]', '_cn6ca': 'Twanna', '_cokwr': '005C0000004tB'} 
{'_chk2m': '[email protected]', '_cn6ca': 'JaneyD', '_cokwr': '005C0000003xJ} 
{'_chk2m': '[email protected]', '_cn6ca': 'Charlot', '_cokwr': '005C0000003yS} 
{'_chk2m': '[email protected]', '_cn6ca': 'Janessa', '_cokwr': '005C0000004pE'} 
{'_chk2m': '[email protected]', '_cn6ca': 'Matilda', '_cokwr': '005C000 0003xK'} 
{'_chk2m': '[email protected]', '_cn6ca': 'ChloeR', '_cokwr': '005C00000040h'} 

我试图让用户提交的用户别名(该行第2项,例如,“PaulDu”),并有编号返回

我试过(行中的第3项)一些东西e:

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) 
+2

请发布可复制粘贴的实际文本,而不是截图。 – abarnert

+0

对不起,应该修复。 – gigawatts

+0

您编辑的版本中有多个'SyntaxError's。你真的可以复制并粘贴它,而不是输入某种不能实际评估的关闭内容吗? – abarnert

回答

0

首先,之前,你甚至去搜索文件...

名称in_path意味着它是一个路径。如果是这样,这行:

for row in in_path: 

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

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

在这样是print出中间值调试任何问题的第一步骤。如果你print每个row编辑,它会立即明白为什么这不起作用。


接下来,是这一行的几个问题:

if (user_alias in elt for elt in row): 

首先,row似乎是一个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(): 

同时:

Also, how would I then call the email from the now identified row?

好了,你的代码意味着,你不知道的钥匙,这意味着你可以也可能是唯一的事情做是通过找到的行中的值并启发式地找到最像电子邮件地址的那个值。

如果知道的钥匙,这是一个更容易:

if user_alias == row['_cn6ca']: 
    email = row['_chk2m'] 
+0

我试过了你发布的任何语句,但我的测试打印没有打印任何行。我假设这意味着进入PaulDu后没有成功查看行? – gigawatts

+0

@ gigawatts:可能。但直到你给我们提供有用的数据之前,很难说清楚。 [Here](http://pastebin.com/08xkLgqC)我已经修复了一些可用的,经过测试的,并成功地找到了一行代码。同时,请参阅编辑后的版本,以解决您在遇到此问题之前可能遇到的更大问题。 – abarnert

+0

另外,在你的结束评论,这是我的主要挑战。用户不会知道密钥,他们只会将用户别名作为输入,并期望查找电子邮件。但由于每种信息的关键是相同的,我假设你的启发式方法将起作用 – gigawatts

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

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'] 
相关问题