我有一个在简单列表上正常工作的脚本。它从单词列表中删除一些不需要的字符,使它们相互匹配并返回几个相似单词列表(比率为0.6)。
但现在我需要它来使用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 :(得分:3)
您可以使用索引索引每一行。此行只有一列,因此您可以使用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)
# ...
答案 1 :(得分:0)
我只是偶然发现了这篇文章,以为我已经完成了。我有同样的问题。使用pyodbc时,正确的语法是Row.ColumnName而不是row ['ColumnName']。古怪,但有效