J'apprends Python (j'ai un fond C/C++).Comment écrire cet extrait de code en Python?
J'ai besoin d'écrire quelque chose de pratique en Python, tout en apprenant. J'ai le pseudo-code suivant (ma première tentative d'écriture d'un script Python, depuis que j'ai lu Python hier). J'espère que l'extrait détaille la logique de ce que je veux faire. BTW J'utilise python 2.6 sur Ubuntu Karmic.
Supposons que le script est appelé comme: script_name.py directory_path
import csv, sys, os, glob
# Can I declare that the function accepts a dictionary as first arg?
def getItemValue(item, key, defval)
return !item.haskey(key) ? defval : item[key]
dirname = sys.argv[1]
# declare some default values here
weight, is_male, default_city_id = 100, true, 1
# fetch some data from a database table into a nested dictionary, indexed by a string
curr_dict = load_dict_from_db('foo')
#iterate through all the files matching *.csv in the specified folder
for infile in glob.glob(os.path.join(dirname, '*.csv')):
#get the file name (without the '.csv' extension)
code = infile[0:-4]
# open file, and iterate through the rows of the current file (a CSV file)
f = open(infile, 'rt')
try:
reader = csv.reader(f)
for row in reader:
#lookup the id for the code in the dictionary
id = curr_dict[code]['id']
name = row['name']
address1 = row['address1']
address2 = row['address2']
city_id = getItemValue(row, 'city_id', default_city_id)
# insert row to database table
finally:
f.close()
J'ai les questions suivantes:
est le code écrit d'une manière assez Pythonic (est-il une meilleure façon de l'implémenter)?
Étant donné une table avec un schéma comme montré ci-dessous, comment puis-je écrire une fonction Python qui récupère des données de la table et renvoie dans un dictionnaire indexé par une chaîne (nom).
Comment puis-je insérer les données de ligne dans la table (en fait je voudrais utiliser une transaction si possible, et engager juste avant que le fichier est fermé)
Schéma de la table:
create table demo (id int, name varchar(32), weight float, city_id int);
BTW, ma base de données back-end est postgreSQL
[Modifier]
Wayne et al:
Pour clarifier, ce que je veux, c'est un ensemble de lignes. Chaque ligne peut être indexée par une clé (ce qui signifie que le conteneur des lignes est un dictionnaire (à droite)? Ok, maintenant une fois que nous avons récupéré une ligne en utilisant la clé, je veux aussi pouvoir accéder aux 'colonnes' la ligne - ce qui signifie que les données de la ligne elle-même est un dictionnaire.Je ne sais pas si Python prend en charge la syntaxe de tableau multidimensionnelle lorsqu'il s'agit de dictionnaires - mais la déclaration suivante aidera à expliquer comment je compte utiliser conceptuellement les données renvoyées par la base de données. dataset ['joe'] ['weight'] récupérera d'abord les données de la ligne indexées par la clé 'joe' (qui est un dictionnaire), puis indexera ce dictionnaire pour la clé 'weight' Je veux savoir comment construire un dictionnaire de dictionnaires à partir des données récupérées d'une manière pythonique comme vous l'avez fait auparavant
Une manière simpliste serait d'écrire quelque chose comme:
import pyodbc
mydict = {}
cnxn = pyodbc.connect(params)
cursor = cnxn.cursor()
cursor.execute("select user_id, user_name from users"):
for row in cursor:
mydict[row.id] = row
Est-ce correct/peut-il être écrit d'une manière plus pythonique?
s'il vous plaît répondez aux commentaires si vous voulez une réponse, sinon nous ne serons pas paginés. Il me semble parfaitement pythonique - les lignes que je pense sont renvoyées sous forme de tuples qui peuvent être accédées par index et par nom de colonne donc ce pourrait être 'mydict [row [0]] = row [1]' ou mydict [row. user_id] = row.user_name' (ils donnent tous les deux le même résultat.) Et oui, vous pouvez avoir des tableaux multidimensionnels, des listes/tuples dans des dicts et vice-versa à autant de dimensions que vous le souhaitez :-) – cryo
Vous pouvez créer un dictionnaire comme par exemple. 'pour la ligne dans le curseur: mydict [row.user_id] = {'nom d'utilisateur': row.user_name, 'weight': row.weight}' – cryo