Okay so I'm writing a script in python right now as a dirty fix for a
problem we're having at work.. Unfortunately this is the first really
non-trivial script that I've had to work with in python and the book
that I have on it really kind of sucks.
I'm having an issue parsing lines of 'last' output that I have stored
in a /tmp file. The first time it does a .readline() I get the full
line of output, which I'm then able to split() and work with the
individual fields of without any problem. Unfortunately, the second
time that I do a .readline() on the file, I am only receiving the
first character of the first field. Looking through the /tmp file
shows that it's not corrupted from the format that it should be in at
all... Here's the relevant script:
----
#parse
Lastdump = open('/tmp/esd_tmp', 'r')
#find out what the last day entry is in the wtmp
cur_rec = Lastdump.readline()
work = cur_rec.split()
if debug == 1:
print work
print " is our split record line from /tmp/esd_tmp\n"
startday = work[3]
if debug == 1:
print startday + " is the starting day\n"
print days
print " is our dictionary of days\n"
print days[startday] + " is our ending day\n"
for cur_rec in Lastdump.readline():
work = cur_rec.split()
if debug == 1:
print "Starting table building pass . . .\n"
print work
print " is the contents of our split record line now\n"
print cur_rec + " is the contents of cur_rec\n"
#only go back 2 days
while work[0] != days[startday]:
tmp = work[1]
if table.has_key(work[0]):
continue
elif tmp[0] != ':':
#don't keep it if it isn't a SunRay terminal
identifier
continue
else:
#now we keep it
table[work[0]] = tmp
----
the first and second sets of debugging output show everything as they
should be... the third shows that the next working line (in cur_rec),
and thus 'work', as well, only hold the first character of the line.
Here's the output:
----
Debugging run
Building table . . .
['dgetsman', 'pts/3', ':0.0', 'Wed', 'May', '21', '10:21', 'still',
'logged',
'in']
is our split record line from /tmp/esd_tmp
Wed is the starting day
{'Wed': 'Mon', 'Sun': 'Fri', 'Fri': 'Wed', 'Thurs': 'Tues', 'Tues':
'Sun',
'Mon': 'Sat', 'Sat': 'Thurs'}
is our dictionary of days
Mon is our ending day
Starting table building pass . . .
['d']
is the contents of our split record line now
d is the contents of cur_rec
----
And thus everything fails when I try to work with the different fields
in subsequent script afterwards. Does anybody have an idea as to why
this would be happening?
Oh, and if relevant, here's the datafile's first few lines:
----
dgetsman pts/3 :0.0 Wed May 21 10:21 still logged
in
dgetsman pts/2 :0.0 Wed May 21 09:04 still logged
in
dgetsman pts/1 :0.0 Wed May 21 08:56 - 10:21
(01:24)
dgetsman pts/0 :0.0 Wed May 21 08:56 still logged
in
I would really appreciate any pointers or suggestions you can give.
<a href="http://www.zoominfo.com/people/Getsman_Damon_-214241.aspx">
*Damon Getsman
Linux/Solaris System Administrator
</a> 3 1853
Okay, so I manged to kludge around the issue by not using
the .readline() in my 'for' statement. Instead, I'm slurping the
whole file into a new list that I put in for that purpose, and
everything seems to be working just fine. However, I don't know WHY
the other method failed and I'm at a loss for why that didn't work and
this is working. I'd really like to know the why about this issue so
that I don't have to use crappy coding practice and kludge around it
the next time I have an issue like this.
Any ideas much appreciated.
Damon G.
On May 21, 10:59*am, Damon Getsman <dgets...@amirehab.netwrote:
I'm having an issue parsing lines of 'last' output that I have stored
in a /tmp file. *The first time it does a .readline() I get the full
line of output, which I'm then able to split() and work with the
individual fields of without any problem. *Unfortunately, the second
time that I do a .readline() on the file, I am only receiving the
first character of the first field. *Looking through the /tmp file
shows that it's not corrupted from the format that it should be in at
all... *Here's the relevant script:
----
* * #parse
* * Lastdump = open('/tmp/esd_tmp', 'r')
* * #find out what the last day entry is in the wtmp
* * cur_rec = Lastdump.readline()
* * work = cur_rec.split()
* * if debug == 1:
* * * * print work
* * * * print " is our split record line from /tmp/esd_tmp\n"
* * startday = work[3]
* * if debug == 1:
* * * * print startday + " is the starting day\n"
* * * * print days
* * * * print " is our dictionary of days\n"
* * * * print days[startday] + " is our ending day\n"
* * for cur_rec in Lastdump.readline():
* * * * work = cur_rec.split()
<snip>
for cur_rec in Lastdump.readline():
is the problem. readline() returns a string containing the next
line's worth of text, NOT an iterator over all the subsequent lines in
the file. So your code is really saying:
next_line_in_file = Lastdump.readline():
for cur_rec in next_line_in_file:
which of course, is iterating over a string character by character.
Since you are opening Lastdump (not great casing for a variable name,
BTW - looks like a class name with that leading capital letter), it
gives you an iterator already. Try this instead:
lastdump = open('/tmp/esd_tmp', 'r')
cur_rec = lastdump.next()
...
for cur_rec in lastdump:
...
This should get you over the hump on reading the file.
Also, may I suggest this method for splitting up each record line, and
assigning individual fields to variables:
user,s1,s2,day,month,date,time,desc = cur_rec.split(None,7)
-- Paul
On May 21, 11:15 am, Paul McGuire <pt...@austin.rr.comwrote:
<snip>
for cur_rec in Lastdump.readline():
is the problem. readline() returns a string containing the next
line's worth of text, NOT an iterator over all the subsequent lines in
the file. So your code is really saying:
next_line_in_file = Lastdump.readline():
for cur_rec in next_line_in_file:
which of course, is iterating over a string character by character.
Since you are opening Lastdump (not great casing for a variable name,
BTW - looks like a class name with that leading capital letter), it
gives you an iterator already. Try this instead:
lastdump = open('/tmp/esd_tmp', 'r')
cur_rec = lastdump.next()
...
for cur_rec in lastdump:
...
This should get you over the hump on reading the file.
Also, may I suggest this method for splitting up each record line, and
assigning individual fields to variables:
user,s1,s2,day,month,date,time,desc = cur_rec.split(None,7)
-- Paul
Well the individual variables isn't exactly appropriate as I'm only
going to be using 2 of the fields. I think I will set those to
individual variables with a slice of what you mentioned, though, for
readability. Thank you for the tips, they were all much appreciated.
-Damon This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: RiGGa |
last post by:
Hi,
I want to parse a web page in Python and have it write certain values out to
a mysql database. I really dont know where to start with parsing the html
code ( I can work out the database...
|
by: Martin Robins |
last post by:
I am trying to parse a string that is similar in form to an OLEDB connection string using regular expressions; in principle it is working, but certain character combinations in the string being...
|
by: Adam Parkin |
last post by:
Hello all, I'm trying to write a function which given a std::string
parses the string by breaking the sentance up by whitespace (\t, ' ',
\n) and returns the result as a vector of strings. Here's...
|
by: Mantorok Redgormor |
last post by:
If I am parsing a config file that uses '#' for comments and the
config file itself is 1640 bytes, and the format is VARIABLE=VALUE, is
it recommended to use
a) fgetc (parse a character at a...
|
by: David |
last post by:
I have rows of 8 numerical values in a text file that I have to parse. Each
value must occupy 10 spaces and can be either a decimal or an integer.
// these are valid - each fit in a 10 character...
|
by: ankitdesai |
last post by:
I would like to parse a couple of tables within an individual player's
SHTML page. For example, I would like to get the "Actual Pitching
Statistics" and the "Translated Pitching Statistics"...
|
by: toton |
last post by:
Hi,
I have some ascii files, which are having some formatted text. I want
to read some section only from the total file.
For that what I am doing is indexing the sections (denoted by .START
in...
|
by: Dave Townsend |
last post by:
Hi,
I have to read some memory data from a stream. This would be in the
following format, for example:
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
that is i have 8 values on a line, separated...
|
by: charliefortune |
last post by:
I am fetching some product feeds with PHP like this
$merch = substr($key,1);
$feed = file_get_contents($_POST);
$fp = fopen("./feeds/feed".$merch.".txt","w+");
fwrite ($fp,$feed);
fclose...
|
by: pereges |
last post by:
Hi I've a string input and I have to parse it in such a way that that
there can be only white space till a digit is reached and once a digit
is reached, there can be only digits or white space till...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 7 Feb 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:30 (7.30PM).
In this month's session, the creator of the excellent VBE...
|
by: MeoLessi9 |
last post by:
I have VirtualBox installed on Windows 11 and now I would like to install Kali on a virtual machine. However, on the official website, I see two options: "Installer images" and "Virtual machines"....
|
by: DolphinDB |
last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation.
Take...
|
by: DolphinDB |
last post by:
Tired of spending countless mintues downsampling your data? Look no further!
In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
|
by: Aftab Ahmad |
last post by:
Hello Experts!
I have written a code in MS Access for a cmd called "WhatsApp Message" to open WhatsApp using that very code but the problem is that it gives a popup message everytime I clicked on...
|
by: Aftab Ahmad |
last post by:
So, I have written a code for a cmd called "Send WhatsApp Message" to open and send WhatsApp messaage. The code is given below.
Dim IE As Object
Set IE =...
|
by: ryjfgjl |
last post by:
ExcelToDatabase: batch import excel into database automatically...
|
by: marcoviolo |
last post by:
Dear all,
I would like to implement on my worksheet an vlookup dynamic , that consider a change of pivot excel via win32com, from an external excel (without open it) and save the new file into a...
|
by: Vimpel783 |
last post by:
Hello!
Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
| |