Ed: I studied the code below until I understood it and then redid my
data conversion and it worked perfectly. Thanks for taking the time to
help me with this!!!!
Jeff
Jeff Johnson
[EMAIL PROTECTED]
SanDC, Inc.
623-582-0323
Fax 623-869-0675
Ed Leafe wrote:
> On Sep 24, 2007, at 10:33 AM, Jeff Johnson wrote:
> Ed: You are correct. My list has only the data and I am trying to
> write it as a string to a file with a new line at the end of each
> record. Each record has the same number of fields.
>
> OK, I'm going to take the Dive Into Python approach, and show you
> the solution, followed by an explanation of each piece. I'm going to
> simulate the data with a list of strings representing the first 60
> numbers.
>
> 1 # Number of fields per record
> 2 flds = 3
> 3 data = ["%s" % i for i in range(60)]
> 4 nthFields = [data[n::flds] for n in range(flds)]
> 5 recTuples = zip(*nthFields)
> 6 recs = [",".join(tup) for tup in recTuples]
> 7 ouput = "\n".join(recs)
> 8 file("data.txt", "w").write(output)
>
> Line 3 creates the data; it's just the strings ["0", "1", ...,"59"].
> I used strings because the join commands used later on require string
> values.
>
> Line 4 is a list comprehension. The inner part, 'data[n::flds]', is
> a slice notation that means "start at element 'n', go to the end, and
> give me every 'flds' element". So in our case, this will be every 3rd
> element, so this will return the list ["0", "3", "6", "9", ...] when
> n=0; it will be ["1", "4", "7", "10", ...] when n=1, etc.. The
> comprehension is for n in range(flds), which means that n will be 0,
> then 1, then 2, resulting in three big lists. That is what the
> nthFields name represents, and it looks like:
>
> [['0', '3', '6', '9', '12', '15', '18', '21', '24', '27', '30', '33',
> '36', '39', '42', '45', '48', '51', '54', '57'], ['1', '4', '7',
> '10', '13', '16', '19', '22', '25', '28', '31', '34', '37', '40',
> '43', '46', '49', '52', '55', '58'], ['2', '5', '8', '11', '14',
> '17', '20', '23', '26', '29', '32', '35', '38', '41', '44', '47',
> '50', '53', '56', '59']]
>
> Line 5 uses the zip function to merge the nth element of each list
> into a tuple. It takes as many arguments as you have lists. Out
> 'nthFields' is a single list with 3 sub-lists as the elements, so we
> would need to write this as:
>
> zip(nthFields[0], nthFields[1], nthFields[2])
>
> But this doesn't scale; what if we changed 'flds' to 2 or 6? So
> instead of hardcoding the arguments, we use the *params syntax to
> expand the nthFields list into its separate elements; this way the zip
> () function receives 3 lists. The resulting value of recTuples is now:
>
> [('0', '1', '2'), ('3', '4', '5'), ('6', '7', '8'), ('9', '10',
> '11'), ('12', '13', '14'), ('15', '16', '17'), ('18', '19', '20'),
> ('21', '22', '23'), ('24', '25', '26'), ('27', '28', '29'), ('30',
> '31', '32'), ('33', '34', '35'), ('36', '37', '38'), ('39', '40',
> '41'), ('42', '43', '44'), ('45', '46', '47'), ('48', '49', '50'),
> ('51', '52', '53'), ('54', '55', '56'), ('57', '58', '59')]
>
> Note that we now have the data broken up into one tuple for each
> record. Each tuple, though, contains separate fields; we want to join
> them into a single string that will be written for that record.
> That's what line 6 does: first it uses the join() method of strings
> to join the elements of each tuple into a comma-separated list, and
> then uses a list comprehension to iterate over all the tuples,
> creating a list with one string element for each record. The value of
> 'recs' at this point is:
>
> ['0,1,2', '3,4,5', '6,7,8', '9,10,11', '12,13,14', '15,16,17',
> '18,19,20', '21,22,23', '24,25,26', '27,28,29', '30,31,32',
> '33,34,35', '36,37,38', '39,40,41', '42,43,44', '45,46,47',
> '48,49,50', '51,52,53', '54,55,56', '57,58,59']
>
> Now we have every record converted to a single string. We need to
> join these records with newlines; that's what line 7 does. Line 8
> writes the output to the file.
>
> There are probably several other ways to accomplish this task; I
> chose this one because it's very flexible. Try changing the value of
> 'flds' to any other value, and see how the output changes.
>
> -- Ed Leafe
> -- http://leafe.com
> -- http://dabodev.com
>
_______________________________________________
Post Messages to: [email protected]
Subscription Maintenance: http://leafe.com/mailman/listinfo/dabo-users
Searchable Archives: http://leafe.com/archives/search/dabo-users
This message: http://leafe.com/archives/byMID/dabo-users/[EMAIL PROTECTED]