2017-10-13 5 views
1

私は単純なリストでうまく動作するスクリプトを持っています。それは、単語のリストからいくつかの不要な文字を取り除き、それらを互いに一致させ、同様の単語のいくつかのリストを返す(0.6の比率で)。pyodbcでcursor.fetchallを使用してデータベースから行のリストを作成するにはどうすればよいですか?

しかし、今私はそれがAccessデータベースで動作する必要があります。 私はcrsr.fetchall()でforループを作成し、すべての項目をリスト( "words")に入れると、以前と同じように動作すると思いました。残念ながら、それはここに私のコードだではないと私は本当にそれを把握することはできません...

ん:

# -*- 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) 

しかし、私はこのようになります項目のリストを持って、それがすべてで満足していない:を

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

:私は単純なリストでそれをテストすることによって、以前得た結果ここ

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) 

されています。ここでは

[('anbaglé',), ('anfoutan',), ('òrdinè',), ('alakous',), ('ayen',), ('anmè',), ('antòtiyé',),...] 
は、単純なリストの上に完全に働いたコードの残りの部分ですカーソル部分全体が間違っているはずですが、どういう仕組みか分かりません...助けてくれてありがとう!

+0

最初のコードスニペットでは、words.append [item]を使用しています。 words.append(item)を使うべきです。 appendはメソッドです。 – Kyle

+0

ありがとうございますが、この列の項目をリストに入れることはできますか? –

+0

fetchall()から返された行はタプルのように動作しますが、名前で列にアクセスすることもできます。ループ内で** words.append(アイテム['unites_lexicales'])**または** words.append(アイテム[0])**を試してください。いくつかの良い例があります。[https://github.com/mkleehammer/pyodbc/wiki/Getting-started#selecting-some-data]を参照してください。 – Kyle

答えて

1

インデックスを使用して各行にインデックスを付けることができます。この行には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でなく整数でなければなりません –

関連する問題