如何使用cursor.fetchall和pyodbc从数据库中的行中创建列表?

时间:2017-10-13 17:48:39

标签: python database cursor pyodbc fetchall

我有一个在简单列表上正常工作的脚本。它从单词列表中删除一些不需要的字符,使它们相互匹配并返回几个相似单词列表(比率为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']]

我必须把整个光标部分弄错,我真的不明白它是如何工作的......谢谢你的帮助!

2 个答案:

答案 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']。古怪,但有效