2013-10-14 27 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'] 
相關問題