Alan Gauld wrote: > "Bryan Fodness" <[EMAIL PROTECTED]> wrote in > >> fields = {} >> for line in open('data.txt') : >> if line : ## You shouldn't need this. >> if line.split()[0] == 'field' : >> field = int(line.split()[-1]) >> else : >> fields[field] = tuple(line.split()) >> >> fields[field] = tuple(line.split()) >> NameError: name 'field' is not defined > > As you should expect since you only define field inside > the if branch so if you go down the else route first then > field will not exist. > > I'm jumping into this rather late but I'd have thought > something like this (untested code) might work: > > fields = {} > for line in open('data.txt'): > try: > name,value = line.split() > fields[name] = int(value) > except AttributeError: pass # catches blank lines > > Or if you can control the data format the ConfigParser module > might be a better solution. > > > HTH, >
Nice use of try block! I should point though that the OP's file has this structure : > My data is in a file with a format, where there may be multiple fields > > >> > > >> field = 1 > > >> > > >> 1a 0 > > > > So you have a line where you get the field key and then a line where you get the values for that field (that's how I interpreted it), in that case the error comes from the fact that there is no "field = n" line before a value pair (if that would happen later the code I submitted wouldn't catch the error). OR the OP's line "field = 0" was not part of the file and then you have two choices, the "field" in the example submitted is "1" and the data : (a, 0) and there may be multiple lines with the same field, or there will be one data tuple for each "field" value. That would be : (yes, I used Alan's code, nicer than mine) Case 1) multiple tuples per field value fields = {} for line in open('data.txt'): try: name,value = line.split() fields.setdefault(name[:-1], []).append(tuple(name[-1],int(value))) except AttributeError: pass # catches blank lines case 2) one tuple per field value fields = {} for line in open('data.txt'): try: name,value = line.split() fields[name[:-1]] = tuple(name[-1],int(value)) except AttributeError: pass # catches blank lines I don't have the OP's original post at hand so maybe he should clarify his file's structure. _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor