Hi,
I'm getting some output by running a command using os.popen. I need to
parse the output and transform it in some sense so that it's 'DB
compatible', (i.e I need to store the output in a database (postgres)
after escaping some characters). Since I'm new to python, I wasn't sure
if there was a better way of doing this so this is what I did:
# Parse the output returned by popen and return the script
out = os.popen('some command')
all_lines = out.readlines()
script = []
for i in xrange(len(all_ lines)):
line = all_lines[i].replace("'", "\\'")[0:len(line)-1]
# replace ' with \'
line_without_ca rriage = line[0:len(line)-1] # remove
carriage
line_without_ca rriage =
line_without_ca rriage.replace( "\\n", "$___n") # replace end of line with
$___n
line_without_ca rriage += "@___n" # add a 'end of line'
character to the end
script.append(l ine_without_car riage)
# end for
script = ''.join(script)
Please help because I'm pretty sure I'm wasting a lot of cpu time in
this loop. Thanks
Steve 12 1726
On Tue, 13 Jul 2004 16:48:36 +1000, Unknown <un*****@unknow n.invalid>
wrote: I'm getting some output by running a command using os.popen. I need to parse the output and transform it in some sense so that it's 'DB compatible', (i.e I need to store the output in a database (postgres) after escaping some characters).
If you are using Python's DB API 2.0 than this escaping would be done by
the API: import odbc,dbi con = odbc.odbc("DB_I D/USERNAME/PASSWORD") cur = con.cursor() sql = "INSERT INTO output (line) VALUES (?)" dirty_line = 'Some text with forbidden characters\n\r. ..' cur.execute(sql , dirty_line)
So, no need to parse (and afterwards unparse) the ouput - I don't think
that anyone can beat this speed up!
Regards,
Marco
Marco Aschwanden wrote: On Tue, 13 Jul 2004 16:48:36 +1000, Unknown <un*****@unknow n.invalid> wrote:
I'm getting some output by running a command using os.popen. I need to parse the output and transform it in some sense so that it's 'DB compatible', (i.e I need to store the output in a database (postgres) after escaping some characters).
If you are using Python's DB API 2.0 than this escaping would be done by the API:
import odbc,dbi con = odbc.odbc("DB_I D/USERNAME/PASSWORD") cur = con.cursor() sql = "INSERT INTO output (line) VALUES (?)" dirty_line = 'Some text with forbidden characters\n\r. ..' cur.execute(sql , dirty_line)
So, no need to parse (and afterwards unparse) the ouput - I don't think that anyone can beat this speed up!
Except if you're aiming for database independence, as different database
drivers support different means of escaping parameters...
David
On Tue, 13 Jul 2004 16:48:36 +1000, Steve wrote: Hi,
I'm getting some output by running a command using os.popen. I need to parse the output and transform it in some sense so that it's 'DB compatible', (i.e I need to store the output in a database (postgres) after escaping some characters). Since I'm new to python, I wasn't sure if there was a better way of doing this so this is what I did:
if you were replacing a character with another, the best and quick way was
to use a translation table, but you're not lucky
line = all_lines[i].replace("'", "\\'")[0:len(line)-1] # replace ' with \'
? this can't work. You never defined "line" and you're using "len" on it.
I think you want to delete the last character of the string. if so, you
can use negative indexes
line = all_lines[i].replace("'", "\\'")[:-1]
the 0 disappeared is the default value
line_without_ca rriage = line[0:len(line)-1] # remove carriage
similar here
line_without_ca rriage = line[:-1]
but you're just deleting the current last character of the string.
so you could delete this line and change the indexing in the first one
so the first one would become
line = all_lines[i].replace("'", "\\'")[:-2]
ah, I don't think you're removing a carriage return ('\r') here.
If your line end with '\r\n' you're killing '\n' , a line feed.
This is important 'cause in the next line....
line_without_ca rriage = line_without_ca rriage.replace( "\\n", "$___n")
# replace end of line with $___n
.... you try to replace '\\n' ,
are you intending to delete the line feed, the end of line ?
if this is the case you should write '\n' (one character) not '\\n' (a
string of len 2)
line_without_ca rriage += "@___n" script.append(l ine_without_car riage) # end for script = ''.join(script)
the best here is to do
script.append(l ine_without_car riage)
script.append(' @___n')
# end for
script = ''.join(script)
Appending '@___n' you don't need to loose memory for destroying and
creating a new string each time
Please help because I'm pretty sure I'm wasting a lot of cpu time in this loop. Thanks
Steve
Ciao,
Riccardo
--
-=Riccardo Galli=-
_,e.
s~ ``
~@. ideralis Programs
.. ol
`**~ http://www.sideralis.net
David Fraser wrote: Except if you're aiming for database independence, as different database drivers support different means of escaping parameters...
IMHO database independence is both overrated not to mention impossible.
You can always try the 'greatest common factor' approach but that
causes more trouble (and work) than it saves.
I agree with the previous poster stating that escaping should be done
in the DB API, but it is better to use the 'typed' escaping:
sql = 'SELECT FROM users WHERE user_id=%d AND user_passwd=%s'
par = [1, 'something']
cursor.execute( sql, par)
Istvan.
On Tue, 13 Jul 2004 16:48:36 +1000
Steve <nospam@nopes > threw this fish to the penguins: I'm getting some output by running a command using os.popen. I need to parse the output and transform it in some sense so that it's 'DB compatible', (i.e I need to store the output in a database (postgres) after escaping some characters). Since I'm new to python, I wasn't sure if there was a better way of doing this so this is what I did:
# Parse the output returned by popen and return the script out = os.popen('some command') all_lines = out.readlines()
script = [] for i in xrange(len(all_ lines)): line = all_lines[i].replace("'", "\\'")[0:len(line)-1] # replace ' with \' line_without_ca rriage = line[0:len(line)-1] # remove carriage line_without_ca rriage = line_without_ca rriage.replace( "\\n", "$___n") # replace end of line with $___n line_without_ca rriage += "@___n" # add a 'end of line' character to the end script.append(l ine_without_car riage) # end for
script = ''.join(script)
How about :
lines = []
out = os.popen('some command')
for l in out:
lines.append(l. strip())
script = ''.join(lines)
out.close()
The "strip" actually removes white space from front and back of the string;
you could say l.strip('\n') if you only want the newlines removed (or '\r'
if they're really carriage return characters.)
Or if you want a clever (and most CPU efficient!) one-liner:
script = [l.strip() for l in os.popen('some command')]
I'm not advocating such a terse one-liner unless you are very comfortable
with it's meaning; will you easily know what it does when you see it
six months from now in the heat of battle?
Also, the one-liner does not allow you to explicitly close the file
descriptor from popen. This could be a serious problem if it gets run
hundreds of times in a loop.
Have fun,
-- George Young
--
"Are the gods not just?" "Oh no, child.
What would become of us if they were?" (CSL)
What about handling all output as one string?
script = os.popen('some command')
script = script.replace( "'", "\\'") # replace ' with \'
script = script.replace( "\r", ") # remove cr
script = script.replace( "\\n", "$___n") # replace \n
script = script.replace( "\n", "@___n'") # replace nl
/Jean Brouwers
In article <40********@cla rion.carno.net. au>, Steve <nospam@nopes >
wrote: Hi,
I'm getting some output by running a command using os.popen. I need to parse the output and transform it in some sense so that it's 'DB compatible', (i.e I need to store the output in a database (postgres) after escaping some characters). Since I'm new to python, I wasn't sure if there was a better way of doing this so this is what I did:
# Parse the output returned by popen and return the script out = os.popen('some command') all_lines = out.readlines()
script = [] for i in xrange(len(all_ lines)): line = all_lines[i].replace("'", "\\'")[0:len(line)-1] # replace ' with \' line_without_ca rriage = line[0:len(line)-1] # remove carriage line_without_ca rriage = line_without_ca rriage.replace( "\\n", "$___n") # replace end of line with $___n line_without_ca rriage += "@___n" # add a 'end of line' character to the end script.append(l ine_without_car riage) # end for
script = ''.join(script)
Please help because I'm pretty sure I'm wasting a lot of cpu time in this loop. Thanks
Steve
Istvan Albert wrote: David Fraser wrote:
Except if you're aiming for database independence, as different database drivers support different means of escaping parameters...
IMHO database independence is both overrated not to mention impossible. You can always try the 'greatest common factor' approach but that causes more trouble (and work) than it saves.
Not overrated or impossible. It's part of our business model. It works.
I agree with the previous poster stating that escaping should be done in the DB API, but it is better to use the 'typed' escaping:
sql = 'SELECT FROM users WHERE user_id=%d AND user_passwd=%s' par = [1, 'something'] cursor.execute( sql, par)
Better if the database driver you are using supports it... otherwise
userless
I think there is a need to drive towards some sort of standard approach
to this in DB-API (maybe version 3?) as it otherwise nullifies
parameters for anyone using multiple database drivers.
David
Welcome to Python =)
Somebody else already mentioned checking out the DBI API's way of
escaping data; this is a good idea. Besides that, here are some
general tips-
1. Consider using out.xreadlines( ) if you only need one line at a
time:
for line in out.xreadlines( ):
...
If you need all of the data at once, try out.read()
2. You can use negative numbers to index relative to the end of a
sequence:
line[0:-1] is equivalent to line[0:len(line)-1]
(i.e. cut off the last character of a string)
You can also use line.strip() to remove trailing whitespace,
including newlines.
3. If you omit the index on either side of a slice, Python will
default to the beginning and end of a sequence:
line[:] is equivalent to line[0:len(line)]
4. Check out the regular expression module. Here's how to read all of
your output and make multiple escape substitutions. Smashing this
into one regular expression means you only need one pass over the
data. It also avoids string concatenation.
import re, os
out = os.popen('some command')
data = out.read()
substitution_ma p = {
"'" : r"\'",
"\n": "$___n",
}
def sub_func(match_ object, smap=substituti on_map):
return smap[match_object.gr oup(0)]
escape_expr = re.compile('|'. join(substituti on_map.keys())) )
escaped_data = escape_expr.sub (sub_func, data)
# et voila... now you've got a big escaped string without even
# writing a single for loop. Tastes great, less filling.
(caveat: I didn't run this code. It might have typos.)
Steve <nospam@nopes > wrote in message news:<40******* *@clarion.carno .net.au>... Hi,
I'm getting some output by running a command using os.popen. I need to parse the output and transform it in some sense so that it's 'DB compatible', (i.e I need to store the output in a database (postgres) after escaping some characters). Since I'm new to python, I wasn't sure if there was a better way of doing this so this is what I did:
# Parse the output returned by popen and return the script out = os.popen('some command') all_lines = out.readlines()
script = [] for i in xrange(len(all_ lines)): line = all_lines[i].replace("'", "\\'")[0:len(line)-1] # replace ' with \' line_without_ca rriage = line[0:len(line)-1] # remove carriage line_without_ca rriage = line_without_ca rriage.replace( "\\n", "$___n") # replace end of line with $___n
line_without_ca rriage += "@___n" # add a 'end of line' character to the end script.append(l ine_without_car riage) # end for
script = ''.join(script)
Please help because I'm pretty sure I'm wasting a lot of cpu time in this loop. Thanks
Steve
george young wrote: How about:
lines = [] out = os.popen('some command') for l in out: lines.append(l. strip()) script = ''.join(lines) out.close()
The "strip" actually removes white space from front and back of the string; you could say l.strip('\n') if you only want the newlines removed (or '\r' if they're really carriage return characters.)
The above is a great solution... should make for a good speed up. It's
how I might pproach it.
Or if you want a clever (and most CPU efficient!) one-liner:
script = [l.strip() for l in os.popen('some command')]
Clever progammers should be shot! I've had to work behind them... they
are too smart for their own good. They think everyone else in the world
is as clever as they are... this is where they are wrong ;) This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Charles Alexander |
last post by:
Hello
I am new to php & MySQL - I am trying to retrieve some records from a MySQL
table and redisplay them. The data in list form looks like this:
Sample_ID Marker_ID Variation
G23_NA17192.fsa rs7374540 A/C
I23_Control.fsa rs7374540 C/C
|
by: andrewpalumbo |
last post by:
I'm trying to write some code which will split up a vector into two
halves and run a method on the objects in the vector using two seperate
threads. I was hoping to see a near linear speedup on an SMP machine,
but I'm finding that the code below takes almost exactly the same
amount of time as when I iterate through the vector, and don't use any
threads at all (using only one processor). I'm running this on a Dual
Athlon machine under...
|
by: Ognen Duzlevski |
last post by:
Hi all,
I have rewritten a C program to solve a bioinformatics problem. Portion where most of the time is spent is:
def DynAlign(scoremat,insertmat,delmat,tseq,qseq,tlen,qlen):
global ONEINDELPENALTY,OPENGAPPENALTY
for ndx1 in range(1,tlen+1):
for ndx2 in range(1,qlen+1):
delmat = Min(delmat+ONEINDELPENALTY, \
|
by: Mark Dickinson |
last post by:
I have a simple 192-line Python script that begins with the line:
dummy0 = 47
The script runs in less than 2.5 seconds. The variable dummy0 is never
referenced again, directly or indirectly, by the rest of the script.
Here's the surprise: if I remove or comment out this first line, the
script takes more than 15 seconds to run. So it appears that adding a
redundant line produces a spectacular six-fold increase in speed!
|
by: TM |
last post by:
I have a small application that displays records from an access mdb into two
datagrids and am looking to see if it is possible to speedup the loadtime
somehow.
In my formload I am filling my dataset and binding it to the datagrids. Is
there a better place to get my grids loaded and speed up the program
loadtime ?
Thanks
--
| |
by: Lars Schouw |
last post by:
All,
Does anyone know how much performance speedup I can expect by using 64
bit C++ / Windows XP 64 bit over the 32 bit versions?
Did anyone test this under Visual Studio 2005 or Intel C++ 8.1/9.0 ?
My application domain is montecarlo simulations but any test would be
great.
|
by: cj |
last post by:
When I'm inside a do while loop sometimes it's necessary to jump out of
the loop using exit do. I'm also used to being able to jump back and
begin the loop again. Not sure which language my memories are of but I
think I just said loop somewhere inside the loop and it immediately
jumped back to the start of the loop and began again. I can't seem to
do that in .net. I this functionality available?
|
by: Galen Somerville |
last post by:
My VB2005 app gets real time Heart sounds and an ECG from a USB device. I'm
looking for a way to speed up the drawing of the traces on the screen.
In the following code the routine GetSounds recieves the USB data for six
consequtive horizontal pixels (or 6 sound/ECG samples). The routine FixChns
handles the scaling of the data and puts it into the PlotAry for
presentation.
The variable RptCnt then handles the placement for the 6 sets...
|
by: Johnny Blonde |
last post by:
Hello Group!
I really tried hard for two hours to rewrite the following expression
(python 2.4):
--------------------------
teilnehmer =
for r in Reisen.select(AND(Reisen.q.RESVON <= datum, Reisen.q.RESBIS
for g in r.BUCHUNGEN:
for t in g.aktiveTeilnehmer:
teilnehmer.append(t)
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth.
The Art of Business Website Design
Your website is...
| |
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
|
by: agi2029 |
last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own....
Now, this would greatly impact the work of software developers. The idea...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules.
He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms.
Adolph will...
|
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
|
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
| |
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...
| |