2017-10-13 72 views
1

我有一個腳本,可以在一個簡單的列表上正常工作。它從單詞列表中刪除一些不需要的字符,使它們相互匹配並返回幾個相似單詞列表(0.6的比例)。如何使用cursor.fetchall與pyodbc從數據庫的行中創建列表?

但現在我需要它在Access數據庫上工作。 我認爲如果我在crsr.fetchall()上做了一個for循環並將所有項目放入一個列表(「單詞」)中,那麼它可以像以前那樣工作。不幸的是它並沒有,我真的想不通出來...

這裏是我的代碼:

# -*- coding: utf-8 -*- 
import pyodbc 
import re 
from difflib import SequenceMatcher 

[x for x in pyodbc.drivers() if x.startswith('Microsoft Access Driver')] 

# Connection to accdb 

conn_str = (
    r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};' 
    r'DBQ=C:\\Users\\alice\\Desktop\\lexique3.accdb;' 
    ) 
cnxn = pyodbc.connect(conn_str) 
crsr = cnxn.cursor() 

# Put all words into a list 

crsr.execute('SELECT unites_lexicales FROM Mot;') 
result1 = crsr.fetchall() 
words = [] 
for item in result1 : 
    words.append[item] 
print(words) 

在這一點上,我得到了一個錯誤:

TypeError: 'builtin_function_or_method' object is not subscriptable 

我試着與範圍迭代:

crsr.execute('SELECT unites_lexicales FROM Mot;') 
result = crsr.fetchall() 
words = [] 
for i in range(0, len(result)) : 
    words.append(result[i]) 
print(words) 

但我看起來像這樣的項目列表,它不是滿足所有:

[('anbaglé',), ('anfoutan',), ('òrdinè',), ('alakous',), ('ayen',), ('anmè',), ('antòtiyé',),...] 

這裏是一個非常完美的簡單列表中的其餘代碼:

radicals = [] 
motifp = "^(re|em|dés)" 
motifs = "(iste|ment|er|ant|able)$" 

for word in words : 
    word = re.sub(motifp, '', word) 
    word = re.sub(motifs, '', word) 
    radicals.append(word) 
print(radicals) 

ratio = 0.6 
n = len(radicals) 
result = [] 
used_js = [] 

for i in range(n): 
    if i in used_js: 
     continue 
    matches = [words[i]] 
    js = (x for x in range(n) if x != i and x not in used_js) 
    for j in js: 
     if SequenceMatcher(None, radicals[i], radicals[j]).ratio() >= ratio : 
      matches.append(words[j]) 
      used_js.append(j) 
    result.append(matches) 
print(result) 

下面是我通過測試它的簡單羅列在早期得到了結果:

[['flore', 'fleur', 'fleuriste'], ['remaniement', 'remanier', 'manier', 'maniable'], ['désaimer', 'aimant', 'aimer'], ['désemmêler', 'emmêler', 'mêler']] 

我必須得到整個遊標部分錯誤,我真的不明白這是如何工作的......感謝您的幫助!

+0

在你的第一個代碼片段中,你正在使用words.append [item]。你應該使用words.append(item)。追加是一種方法。 – Kyle

+0

好的,謝謝,但是有什麼辦法可以將這一欄中的項目放入列表中? –

+0

從fetchall()返回的行表現如同元組,但您也可以通過名稱訪問列。在循環中嘗試** words.append(item ['unites_lexicales'])**或** words.append(item [0])**。有一些很好的例子[在這裏通過文檔](https://github.com/mkleehammer/pyodbc/wiki/Getting-started#selecting-some-data)。 – Kyle

回答

1

您可以用索引將每一行索引。此行只有一列,因此您可以使用0.您也可以通過名稱對其進行索引。

# ... 
crsr.execute('SELECT unites_lexicales FROM Mot;') 
result = crsr.fetchall() 
words = [] 
for row in result: 
    # words.append(row['unites_lexicales']) 
    words.append(row[0]) 
print(words) 
# ... 

你也可以使用列表理解來獲得第一列。

# ... 
crsr.execute('SELECT unites_lexicales FROM Mot;') 
result = crsr.fetchall() 
# words = [row['unites_lexicales'] for row in result] 
words = [row[0] for row in result] 
print(words) 
# ... 
+0

謝謝!它在我單獨嘗試時有效:我有我的單詞列表,我也有我的單詞列表,但是當我嘗試一切時,我什麼都沒有。沒有錯誤信息,沒有文字,只有黑屏......任何線索? –

+0

即使列表理解仍然沒有任何反應...... –

+0

當我嘗試使用['unites_lexicales']時,出現以下錯誤:TypeError:行索引必須是整數,而不是str –

相關問題