[Tutor] Writing logfile data to a user opened file
Matt D
md123 at nycap.rr.com
Sat Jun 22 02:46:19 CEST 2013
On 06/21/2013 04:44 PM, Prasad, Ramit wrote:
> Matt D wrote:
>> [Ramit P wrote:]
>>> When you open a file the data should be written to that. If you want to
>>> move existing data from logfile.txt into user opened file then you need
>>> to read logfile.txt and then write it to the user opened file. To make
>>> your life simpler, either pass in the file path or open the file save
>>> dialog on __init__.
>>>
>>>
>>> ~Ramit
>>>
>> I got so frustrated try to figure a way to use the logfile.txt that I
>> changed how i log. first i name an array:
>>
>> class TrafficPane(wx.Panel):
>> # Initializer
>> # the class constructor
>> def __init__(self, parent, msgq):
>> wx.Panel.__init__(self, parent)
>> self.msgq = msgq
>> #create the array to put the traffic data in
>> self.log_array = []
>>
>> Then this is how the array gets into the file the user chooses:
>>
>> # openfile defined to start FileDialog
>> def openFile(self, evt):
>> with wx.FileDialog(self, "Choose a file", os.getcwd(), "",
>> "*.txt*", wx.OPEN) as dlg:
>> if dlg.ShowModal() == wx.ID_OK:
>> path = dlg.GetPath()
>> #mypath = os.path.basename(path)
>> mypath = os.path.abspath(path)
>> f = open(mypath, "rw+")
>
> Why are you opening the file in "rw+"?
>
>> f.writelines(self.log_array)
>
> You should really switch to the "with open() as f:" idiom I keep showing
> you. This will automatically close the file for you.
>
> Also note that your file is only getting written once. You should
> probably clear log_array and change the file mode back to append.
>
>>
>> And this is how i get the TextCtrl values into the array:
>>
>> def update(self, field_values):
>> next_line = ""
>> #logger code---------------
>> # first new line
>> #self.logfile.write('\n')
>> # date and time
>> #self.logfile.write('%s,'%(str(strftime("%Y-%m-%d %H:%M:%S",
>> localtime()))))
>> next_line += (str(strftime("%Y-%m-%d %H:%M:%S", localtime())))
>> # loop through each of the TextCtrl objects
>> for k,v in self.fields.items():
>> # get the value of the current TextCtrl field
>> f = field_values.get(k, None)
>> if f:
>> # output the value with trailing comma
>> #self.logfile.write('%s,'%(str(f)))
>> next_line += (str(f) + ',')
>> log_array.append(next_line)
>> #end logger code----------
>>
>> Its running right now. I haven't had the opportunity to test if it
>> works so im keeping my fingers crossed.
>
> This is an inefficient string concatenation. It can take large amounts
> of memory and time.
>
> next_line += (str(f) + ',')
>
> You can use str.join or use the csv module (which I recommend as it
> will escape the delimeter (eg. commas ) if it shows up in the data ).
> I have sent an example of the csv module already. Also note that
> your order of the dictionary is not guaranteed so your data
> may end up out of order after each run.
>
> 'hi', 1 , 5423
> 4255, 'hi', 2
> # instead of
> 1, 'hi', 5423
> 2, 'hi', 4255
>
> # A str.join example
> next_line = []
> for key in sorted( self.fields ):
> f = field_values.get(k, None)
> if f:
> next_line.append(str(f))
> line = ', '.join(next_line)
> log_array.append(line)
>
>
> ~Ramit
Thanks! so i went with:
# openfile defined to start FileDialog
def openFile(self, evt):
with wx.FileDialog(self, "Choose a file", os.getcwd(), "",
"*.txt*", wx.OPEN) as dlg:
if dlg.ShowModal() == wx.ID_OK:
path = dlg.GetPath()
mypath = os.path.basename(path)
#mypath = os.path.abspath(path)
f = open(mypath, "a")
f.writelines(self.log_array)
couldn't figure how to use the "with open() as f:"
and then down here:
# Update the field values
# put values in array
def update(self, field_values):
next_line = ""
next_line += strftime("%Y-%m-%d %H:%M:%S")
next_line += ','.join( field_values[k] for k in
self.fields.keys() if k in field_values )
log_array.append(next_line)
#if the field 'duid' == 'hdu', then clear all the fields
if field_values['duid'] == 'hdu':
self.clear()
#loop through all TextCtrl fields storing the key/value pairs in
k, v
for k,v in self.fields.items():
# get the pickle value for this TextCtrl
f = field_values.get(k, None)
# if the value is empty then set the new value
if f:
v.SetValue(f)
code definitely looks better but is its not working. the TextCtrls are
not receiving their values anymore? i cant tell why?
More information about the Tutor
mailing list