[Tutor] better looping construct for replacing elements in file?

Joel Goldstick joel.goldstick at gmail.com
Thu Feb 2 22:44:30 CET 2012


On Thu, Feb 2, 2012 at 4:29 PM, Brett Longworth <blongworth at whoi.edu> wrote:
> Hi Joel,
>
> Thanks for the reply. The little voice in my head was yelling, "Easier with
> SQL!" the entire time, but I'm trying to learn Python.
>
> -Brett
>
>
> On 2/2/2012 4:16 PM, Joel Goldstick wrote:
>>
>> On Thu, Feb 2, 2012 at 3:50 PM, Brett Longworth<blongworth at whoi.edu>
>>  wrote:
>>>
>>> Hello,
>>>
>>> Today I wrote a quick script to replace elements in multiple lines of a
>>> file
>>> with corresponding elements from a single line in another file, linking
>>> the
>>> two via an index element. The code iterates through the entire source
>>> file
>>> to find the matching index for each line of the destination file. This
>>> works, but it's clearly a terrible way to solve the problem. Can someone
>>> point me to a more efficient, pythonic solution?
>>>
>>> thanks,
>>> -Brett
>>>
>>> Code:
>>>
>>> wheel = "A794"
>>> wheelfile = "A794.txt"
>>> statusfile = "CURRENT.ams"
>>>
>>> sfile = csv.reader(open(statusfile), delimiter='\t')
>>> statusWriter = csv.writer(open('statustest.txt', 'wb'), delimiter='\t',
>>> quotechar='|', quoting=csv.QUOTE_MINIMAL)
>>>
>>> for sline in sfile:
>>>  #print sline
>>>  wfile = csv.reader(open(wheelfile))
>>>  for line in wfile:
>>>    #print line[0]
>>>    #print sline[18]
>>>    if line[0] == sline[18]:
>>>      sline[0] = line [1]
>>>      sline[1] = "OSG"+str(line[4])
>>>      sline[17] = wheel
>>>      sline[21] = line[9]
>>>      statusWriter.writerow(sline)
>>>
>>> Excerpt of wheelfile:
>>>
>>> "2","X496","02/01/12","OSG","106788","85411","GS-13365","Outside Primary
>>> Standard |>  Modern (1950)","2.43","149177"
>>> "3","C655","02/01/12","OSG","106534","83028","HY-19231","Outside Blank |>
>>> 30,000","3.63","149178"
>>>
>>> Excerpt of statusfile:
>>>
>>> Y002    BET2918    10/18/06 15:32:52    160.00    174    1.000    16408
>>>  1.306E-12    1.213E-10    402.6    405.9    -42.7    3.2    1.2242
>>>  -0.0220    1.822    -12.66    A499    2    1    5631    86523    data
>>>  3.7E-6
>>> Y002    BET2918    10/18/06 15:35:46    150.00    162    1.000    15654
>>>  1.313E-12    1.226E-10    407.6    410.3    -43.9    2.0    1.2180
>>>  -0.0243    1.894    -13.03    A499    2    1    5631    86523
>>>  3.7E-6
>>> 0003    BET7147    10/18/06 15:55:33    170.00    186    1.000    3442
>>>  2.903E-13    2.693E-11    357.7    359.3    -46.1    2.5    1.2000
>>>  0.0276    1.734    -12.86    A499    3    1    5631    86524
>>>  3.3E-6
>>> 0003    BET7147    10/18/06 15:58:49    170.00    185    1.000    3232
>>>  2.772E-13    2.598E-11    351.8    353.4    -46.1    3.5    1.2000
>>>  0.0149    1.761    -12.66    A499    3    1    5631    86524
>>>  3.2E-6
>>> 0003    BET7147    10/18/06 16:02:06    170.00    185    1.000    3399
>>>  2.955E-13    2.753E-11    346.9
>>>
>>>
>>> --
>>> Brett Longworth
>>> Research Associate
>>> Woods Hole Oceanographic Institution
>>> ph: 508.289.3559
>>> fax: 508.457.2183
>>>
>>> _______________________________________________
>>> Tutor maillist  -  Tutor at python.org
>>> To unsubscribe or change subscription options:
>>> http://mail.python.org/mailman/listinfo/tutor
>>
>> If you are a little savvy with sql you could write each csv to tables,
>> Since you have csv file input why not write each to a db table.  Then
>> you could join on  line[0] == sline[18] and update your 4 fields.
>>
>> Then dump table as csv
>>
>
>
> --
> Brett Longworth
> Research Associate
> Woods Hole Oceanographic Institution
> ph: 508.289.3559
> fax: 508.457.2183
>

Even so, you would be learning how to do some simple sql things in
python.  It comes with sqlite3 so you don't even need to have mysql on
the machine

-- 
Joel Goldstick


More information about the Tutor mailing list