web-dev-qa-db-fra.com

Comment importer un fichier .accdb dans Python et utiliser les données?

J'essaie de trouver un moyen de créer un programme qui me permette de trouver la meilleure combinaison de données en fonction de plusieurs facteurs différents.

J'ai un fichier Microsoft Access contenant des données sur les créatures. Attaque, défense, santé, compétence de combat requise à utiliser et plusieurs autres informations.

J'essaie d'importer ce fichier .accdb (Access 2013) et de pouvoir accéder aux données stockées.

Je vais essayer de créer un programme qui scanne toutes les données et exécute toutes les combinaisons possibles (ensembles de 5 créatures) pour trouver la combinaison de créatures la plus forte pour les différentes compétences de combat requises (ex: 100 compétences de combat utiliseraient la créature 1, 2, 3, 4 et 5 où 125 compétences de combat utiliseraient la créature 3, 5, 6, 8 et 10)

La principale chose dont j'ai besoin d'aide en premier est de pouvoir importer la base de données pour un accès facile donc je n'ai pas à recréer les données dans python et donc je peux utiliser le même programme pour un nouvel accès bases de données à l'avenir.

J'ai installé https://code.google.com/p/pypyodbc/ mais je n'arrive pas à comprendre comment l'obtenir pour charger un fichier existant.

Éditer

J'ai essayé d'utiliser le code de la réponse de Gord, modifié pour s'adapter à mes informations.

# -*- coding: utf-8 -*-
import pypyodbc
pypyodbc.lowercase = False
conn = pypyodbc.connect(
    r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};" +
    r"Dbq=C:\Users\Ju\Desktop\Dark Summoner.accdb;")
cur = conn.cursor()
cur.execute("SELECT Number, Name, Atk, Def, HP, BP, Species, Special FROM Impulse AA+");
while True:
    row = cur.fetchone()
    if row is None:
        break
    print (u"Creature with Number {1} is {1} ({2})".format(
        row.get("CreatureID"), row.get("Name_EN"), row.get("Name_JP")))
cur.close()
conn.close()

J'obtenais une erreur avec la ligne d'impression alors ajoutée () autour d'elle.

J'obtiens maintenant cette erreur, semblable à ce que j'obtenais dans le passé.

Traceback (most recent call last):
  File "C:\Users\Ju\Desktop\Test.py", line 6, in <module>
    r"Dbq=C:\Users\Ju\Desktop\Dark Summoner.accdb;")
  File "C:\Python34\lib\site-packages\pypyodbc-1.3.3-py3.4.Egg\pypyodbc.py", line 2434, in __init__
    self.connect(connectString, autocommit, ansi, timeout, unicode_results, readonly)
  File "C:\Python34\lib\site-packages\pypyodbc-1.3.3-py3.4.Egg\pypyodbc.py", line 2483, in connect
    check_success(self, ret)
  File "C:\Python34\lib\site-packages\pypyodbc-1.3.3-py3.4.Egg\pypyodbc.py", line 988, in check_success
    ctrl_err(SQL_HANDLE_DBC, ODBC_obj.dbc_h, ret, ODBC_obj.ansi)
  File "C:\Python34\lib\site-packages\pypyodbc-1.3.3-py3.4.Egg\pypyodbc.py", line 964, in ctrl_err
    raise Error(state,err_text)
pypyodbc.Error: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified')

J'ai regardé à travers le fichier pypyodbc.py les lignes mentionnées dans le code d'erreur, mais je n'ai pas pu le comprendre. J'ai essayé de supprimer le "r" au début de r "Driver = {Microsoft Access Driver (* .mdb, * .accdb)};" et j'ai essayé un espace entre r et "Driver parce que je ne savais pas à quoi ça servait, mais j'ai eu une erreur différente.

Éditer

J'ai vérifié mes fichiers comme suggéré. Je crois que j'utilise 64 bits. J'ai vérifié les versions 32 bits et 64 bits. J'ai le pilote Microsoft Access (* .mdb, * .accdb) en 64 bits mais pas en 32 bits. J'utilise la version 2013 de Microsoft Visual Studios.

Éditer

Travaille maintenant!

Mon code de travail final au cas où cela aiderait quelqu'un à l'avenir.

# -*- coding: utf-8 -*-
import pypyodbc
pypyodbc.lowercase = False
conn = pypyodbc.connect(
    r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};" +
    r"Dbq=C:\Users\Ju\Desktop\Dark Summoner.accdb;")
cur = conn.cursor()
cur.execute("SELECT Number, ID, Name, Atk, Def, HP, BP, Species, Special FROM Impulse_AA");
while True:
    row = cur.fetchone()
    if row is None:
        break
    print (u"ID: {1} {2} Atk:{3} Def:{4} HP:{5} BP:{6} Species: {7} {8}".format(
        row.get("Number"), row.get("ID"), row.get("Name"), row.get("Atk"),
        row.get("Def"), row.get("HP"), row.get("BP"), row.get("Species"), row.get("Special") ))
cur.close()
conn.close()
15
Justin

Supposons que vous ayez un fichier de base de données nommé "Database1.accdb" avec une table nommée "Creatures" contenant les données suivantes:

CreatureID  Name_EN   Name_JP
----------  --------  -------
         1  Godzilla  ゴジラ
         2  Mothra    モスラ

Un script minimaliste Python pour lire les données via pypyodbc sur une machine Windows ressemblerait à ceci:

# -*- coding: utf-8 -*-
import pypyodbc
pypyodbc.lowercase = False
conn = pypyodbc.connect(
    r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};" +
    r"Dbq=C:\Users\Public\Database1.accdb;")
cur = conn.cursor()
cur.execute("SELECT CreatureID, Name_EN, Name_JP FROM Creatures");
while True:
    row = cur.fetchone()
    if row is None:
        break
    print(u"Creature with ID {0} is {1} ({2})".format(
        row.get("CreatureID"), row.get("Name_EN"), row.get("Name_JP")))
cur.close()
conn.close()

La sortie résultante est

Creature with ID 1 is Godzilla (ゴジラ)
Creature with ID 2 is Mothra (モスラ)

Modifier

Notez que pour utiliser le pilote "Microsoft Access Driver (* .mdb, * .accdb)", vous devez avoir installé le moteur de base de données Access (a.k.a "ACE") sur votre ordinateur. Vous pouvez vérifier si vous disposez de 32 bits ou 64 bits Python en exécutant le script suivant:

import struct
print("running as {0}-bit".format(struct.calcsize("P") * 8))

Armé de ces informations, vous pouvez télécharger et installer la version correspondante (32 bits ou 64 bits) du moteur de base de données Access à partir d'ici

Moteur de base de données Microsoft Access 2010 redistribuable

12
Gord Thompson