我有一個腳本,可以在一個簡單的列表上正常工作。它從單詞列表中刪除一些不需要的字符,使它們相互匹配並返回幾個相似單詞列表(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']]
我必須得到整個遊標部分錯誤,我真的不明白這是如何工作的......感謝您的幫助!
在你的第一個代碼片段中,你正在使用words.append [item]。你應該使用words.append(item)。追加是一種方法。 – Kyle
好的,謝謝,但是有什麼辦法可以將這一欄中的項目放入列表中? –
從fetchall()返回的行表現如同元組,但您也可以通過名稱訪問列。在循環中嘗試** words.append(item ['unites_lexicales'])**或** words.append(item [0])**。有一些很好的例子[在這裏通過文檔](https://github.com/mkleehammer/pyodbc/wiki/Getting-started#selecting-some-data)。 – Kyle