On 2008-05-06, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote: > Hello gurus,
Hello fellow-guru, > I am grabbing the output from a SQL statement (using PyGreSQL 'pg' > module), and when it returns the result, I am pulling it out as such: > > try: > sc=pg.connect(dbname='mydb',host='dbhost',user='ppp') > except pg.InternalError: > print "Failed to execute SQL: %s" % sql > exit > > for foo in sc.query(sql).dictresult(): <- this returns a dict of the > result I am sure the above is very good. However, as I never program a data base, I absolutely have no clue what data structure you assume here. A literal value in Python syntax or so would be quite useful. > f=dict(foo) f becomes a dict here. Not sure why you do this, as you stated above that you already had a dict. > for k in f.iteritems() k becomes here all key/value pairs of f, ie it is a tuple example: f = {1:'a', 2:'b'} for k in f.iteritems(): print k will print something like (1, 'a') (2, 'b') A more useful statement could be for k,v in f.iteritems(): ... here a multi-assignment is done (the tuple is broken and each part is assigned to a seperate variable), k becomes the key-part, and v becomes the value-part > if k == '^Hostname': <-- need this sort of > behaviour - match a partial string. This will break in two ways. Firstly, k was a tuple, so you cannot compare it with a string. Secondly, this is not the way to match partial strings. The first problem can be solved with the multi-assignment, or by indexing on the tuple (ie k[0] or k[1]). For the second problem, have a look at the string methods: http://docs.python.org/lib/string-methods.html#l2h-233 In this particular case, you can use if k.startswith('Hostname'): or if k[:8] == 'Hostname': # Slice the first 8 chars of the string For more powerful regular expressions, read the 're' module documentation. > print "%s" % f[3] <-- ..and if true, need to pull > out the 4th column on that line. f is a dict. That means indexing is on its keys. Unless you have the integer key 3 in your dictionary, this will not work. f = {3:'q'} print f[3] # prints 'q' However, a dict has no order, so the '4th column' has no meaning. On the other hand, if f is a list, like [10,20,30,40,50], then f[3] is 50, because you can use integers to index in a list (indexing is just a simple form of slicing). > This breaks spectacularly - Ah, segmentation fault? (that would be spectacular at least). It would also help if you tell us at what line it breaks and with what error. > any ideas? Without a explicit Python value of what comes out of the sql query, I can only guess. As example, assume the following data: f = { 1: ['Hostname', 'blabla', 'person', 'john'], 2: ['MachineName', 'blabla', 'company', 'something']} ie a dictionary of column number to rows. Here you are only interested in the value part, and the code becomes. for v in f.itervalues(): if v[0].startswith('Hostname'): print v[3] -- http://mail.python.org/mailman/listinfo/python-list