2017-09-13 47 views
0

初學者在這裏。 我有以下情況。將python列表中的值傳遞給Cassandra查詢

  • 一個文本文件,每行包含一個名稱。
  • 一個卡桑德拉3.5數據庫
  • Python腳本

的目的是使從一個時刻的文件,一個線(一個名字)讀了劇本,並與該名稱查詢卡珊德拉。

僅供參考,一切工作正常,除了當我嘗試將列表的值傳遞給查詢。

我現在有這樣的:如果我刪除標記名列表組件和一個名稱值編輯查詢本身

#... driver import, datetime imports done above 
#... 

with open(fname) as f: 
content = f.readlines() 

# Loop for each line from the number of lines in the name list file 
# num_of_lines is already set 
for x in range(num_of_lines): 
    tagname = str(content[x]) 

    rows = session.execute("""SELECT * FROM tablename where name = %s and date = %s order by time desc limit 1""", (tagname, startDay)) 
    for row in rows: 
     print row.name + ", " + str(row.date) 

,一切工作正常。

我在這裏做錯了什麼?

+0

你得到了什麼? 'NameError:name'tagname'未定義'? – Vinny

+0

另外'tagname = str(content [x])'的期望值是多少?它可能是無,並且是根本原因。 – Vinny

+0

@Vinny不幸的是,我沒有得到任何錯誤。 print row.name ....只是不打印。根本沒有錯誤。現在,tagname = str(content [x])不是none。打印標記名完美工作。 – bshakya

回答

0

您可以通過簡單地content迭代:

for x in content: 

    rows = session.execute("SELECT * FROM tablename where name = {} and date = {} order by time desc limit 1".format(x, startDay)) 
    for row in rows: 
     print row.name + ", " + str(row.date) 
    .... 

而且,你不需要有3個引號的字符串。單引號足夠好(3引號用於文檔/ python中的多行註釋)

請注意,這可能以不同的錯誤結束;但是你將迭代行而不是遍歷索引和讀取行。

+0

謝謝。三個引號,多行。得到它了。 我修改了代碼。它幫助我避免閱讀行數。 在查詢中,我根據您的代碼段將%s更改爲{}。我現在得到以下錯誤: 'TypeError:並非在字符串格式化過程中轉換的所有參數 – bshakya

+0

@bshakya它可能是你有一個None對象。在您的原始打印之前使用調試打印來檢查標籤名稱'打印類型(x)'的類型 – Vinny

+0

觀察。 'print x'顯然在其結尾包含一個\ n。所以當我打印它時,我可以看到正在打印的新行。我認爲這可能是問題所在?我如何刪除它並將其轉換爲純字符串? – bshakya

0

只要在上面的@Vinny的答案上構建,格式就會簡單地替換文字值。你需要在它周圍加引號。

for x in content: 
    rows = session.execute("SELECT * FROM tablename where name ='{}' and date ='{}' order by time desc limit 1".format(x, startDay)) 
    for row in rows: 
     print row.name + ", " + str(row.date) 
0

謝謝,@Vinny和@tejas pandit供您參考。
您的輸入幫助了我很多。然而,核心問題是另一回事。

正如問題中提到的,腳本從文件讀取一行,將此行存儲在變量中並將此變量傳遞給Cassaandra查詢。當它從文件讀取並存儲一行到一個變量時,它還將新行\n存儲在變量中。因此,Cassandra查詢並不真正與\n一起作爲其查詢的一部分。我在變量上做了一個x.strip('\n'),它完美地工作。