writing serial port data to the gzip file

P

Petr Jakes

I am trying to save data it is comming from the serial port continually
for some period.
(expect reading from serial port is 100% not a problem)
Following is an example of the code I am trying to write. It works, but
it produce an empty gz file (0kB size) even I am sure I am getting data
from the serial port. It looks like g.close() does not close the gz
file.
I was reading in the doc:

Calling a GzipFile object's close() method does not close fileobj,
since you might wish to append more material after the compressed
data...

so I am completely lost now...

thanks for your comments.
Petr Jakes
==== snippet of the code ====
def dataOnSerialPort():
data=s.readLine()
if data:
return data
else:
return 0

while 1:
g=gzip.GzipFile("/root/foofile.gz","w")
while dataOnSerialPort():
g.write(data)
else: g.close()
 
L

Leo Kislov

Petr said:
I am trying to save data it is comming from the serial port continually
for some period.
(expect reading from serial port is 100% not a problem)
Following is an example of the code I am trying to write. It works, but
it produce an empty gz file (0kB size) even I am sure I am getting data
from the serial port. It looks like g.close() does not close the gz
file.
I was reading in the doc:

Calling a GzipFile object's close() method does not close fileobj,
since you might wish to append more material after the compressed
data...

so I am completely lost now...

thanks for your comments.
Petr Jakes
==== snippet of the code ====
def dataOnSerialPort():
data=s.readLine()
if data:
return data
else:
return 0

while 1:
g=gzip.GzipFile("/root/foofile.gz","w")
while dataOnSerialPort():
g.write(data)
else: g.close()

Your while loop is discarding result of dataOnSerialPort, so you're
probably writing empty string to the file many times. Typically this
kind of loop are implemented using iterators. Check if your s object
(is it from external library?) already implements iterator. If it does
then

for data in s:
g.write(data)

is all you need. If it doesn't, you can use iter to create iterator for
you:

for data in iter(s.readLine, ''):
g.write(data)

-- Leo
 
D

Dennis Lee Bieber

Following is an example of the code I am trying to write. It works, but
it produce an empty gz file (0kB size) even I am sure I am getting data

According to your code, that is what it should result in
generating...
def dataOnSerialPort():
data=s.readLine()

Unless you are using a custom serial port module, that should be
s.readline()
if data:
return data
else:
return 0

This if statement is meaningless -- if "data" evaluates to false,
return a numeric value that evaluates to false.
while 1:
g=gzip.GzipFile("/root/foofile.gz","w")
while dataOnSerialPort():
g.write(data)

"data" is an uninitialized value here
else: g.close()

And what is the purpose of closing the file if you immediately turn
around and create it again (assuming gzip.GzipFile() behaves as open()
does, a mode of "w" means delete the old file and create a new one.
There is NO exit from the above.

Since I can't read your mind with regards to some of your looping...

s = ... #somewhere you had to open the serial port

g = gzip.GzipFile("/root/foofile.gz", "w")
while True:
data = s.readline()
if not data: break
g.write(data)
g.close()

s.close()


--
Wulfraed Dennis Lee Bieber KD6MOG
(e-mail address removed) (e-mail address removed)
HTTP://wlfraed.home.netcom.com/
(Bestiaria Support Staff: (e-mail address removed))
HTTP://www.bestiaria.com/
 
J

jim-on-linux

If someone hasn't already commented,

Aside from any other problems, the file you are
trying to write to is (opened)?? in the "w" mode.
Every time a file is opened in the 'w' mode,
everything in the file is deleted.

If you open a file in the 'a' mode, then
everything in the file is left untouched and the
new data is appended to the end of the file.

Your while loop is deleting everything in the file
on each loop with the 'w' mode.

try,
vfile = open('vfile', 'a')
rather than
vfile = open('vfile', 'w')

jim-on-linux
http:\\www.inqvista.com
 
P

Petr Jakes

Maybe I am missing something. Expect data is comming continually to the
serial port for the period say 10min. (say form the GPS), than it stops
for 1 minute and so on over and over. I would like to log such a data
to the different gzip files.
My example was written just for the simplicity (I was trying to
demonstrate the problem, it was not the real code and I was really
tired trying to solve it by myself, sorry for the bugy example)

the better way how to write such a infinite loop can be probably:
===== 8< =====
g=0
x=0
while 1:
if not g:
x+=1
g=gzip.GzipFile("/root/foofile%s.gz" % x,"w")
data=dataOnSerialPort()
while data:
myFlag=1
g.write(data)
data=dataOnSerialPort():
else:
if myFlag:
g.close()
pring g
myFlag=0

But it looks like g.close() method does not close the file (while
trying to print the g object, it still exists)
 
P

Petr Jakes

Hi Dennis,
thanks for your reply.
Dennis Lee Bieber napsal:
Unless you are using a custom serial port module, that should be
s.readline() sorry for the typo


This if statement is meaningless -- if "data" evaluates to false,
return a numeric value that evaluates to false.
I see, it is OK just to return data (or an empty string "")
"data" is an uninitialized value here

And what is the purpose of closing the file if you immediately turn
around and create it again (assuming gzip.GzipFile() behaves as open()
does, a mode of "w" means delete the old file and create a new one.
There is NO exit from the above.

Since I can't read your mind with regards to some of your looping...

s = ... #somewhere you had to open the serial port

g = gzip.GzipFile("/root/foofile.gz", "w")
while True:
data = s.readline()
if not data: break
g.write(data)
g.close()

what I am trying to say is g.close() does not close the g file (try to
add the line "print g" after g.close())
Petr
 
D

Dennis Lee Bieber

what I am trying to say is g.close() does not close the g file (try to
add the line "print g" after g.close())
Petr

Well, you could do a "del g" after the g.close(), and let the
garbage collector go around later to physically close the file.

Or... Don't let the gzip module open the file itself. Look at the
documentation -- you can open a file object first, then pass it to the
gzip module (in which case the "file name" is just used to set the
"internal" name of the archive for that section). Then after the
g.close(), also close your file object. (And that is, in my reading, the
mode where it says gzip doesn't close the file object... I've not tried
explicitly).
--
Wulfraed Dennis Lee Bieber KD6MOG
(e-mail address removed) (e-mail address removed)
HTTP://wlfraed.home.netcom.com/
(Bestiaria Support Staff: (e-mail address removed))
HTTP://www.bestiaria.com/
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top