String find and replace

H

hokieghal99

import os, string
print " "
setpath = raw_input("Enter the path: ")
def find_replace(setpath):
for root, dirs, files in os.walk(setpath):
fname = files
for fname in files:
find = string.find(file(os.path.join(root,fname),
'rb').read(), 'THIS')
print find
if find >=1:
replace = string.replace(str, 'THIS', 'THAT')
find_replace(setpath)
print " "

Why doesn't this work? I get this error:

Traceback (most recent call last):
File "html_find_replace.py", line 12, in ?
find_replace(setpath)
File "html_find_replace.py", line 11, in find_replace
replace = string.replace(str, 'THIS', 'THAT')
File "/usr/local/lib/python2.3/string.py", line 370, in replace
return s.replace(old, new, maxsplit)
TypeError: expected a character buffer object
 
?

=?ISO-8859-1?Q?Gerhard_H=E4ring?=

hokieghal99 said:
import os, string
print " "
setpath = raw_input("Enter the path: ")
def find_replace(setpath):
for root, dirs, files in os.walk(setpath):
fname = files
for fname in files:
find = string.find(file(os.path.join(root,fname), 'rb').read(),
'THIS')
print find
if find >=1:
replace = string.replace(str, 'THIS', 'THAT')
^^^

In your app, what do you think 'str' is?

You haven't defined it, but it still exists. It's the string type, *not*
a particular string (cos you haven't defined it). That's why you get the
error below:
find_replace(setpath)
print " "

Why doesn't this work? I get this error:

Traceback (most recent call last):
File "html_find_replace.py", line 12, in ?
find_replace(setpath)
File "html_find_replace.py", line 11, in find_replace
replace = string.replace(str, 'THIS', 'THAT')
File "/usr/local/lib/python2.3/string.py", line 370, in replace
return s.replace(old, new, maxsplit)
TypeError: expected a character buffer object

-- Gerhard
 
J

John Roth

hokieghal99 said:
import os, string
print " "
setpath = raw_input("Enter the path: ")
def find_replace(setpath):
for root, dirs, files in os.walk(setpath):
fname = files
for fname in files:
find = string.find(file(os.path.join(root,fname),
'rb').read(), 'THIS')
print find
if find >=1:
replace = string.replace(str, 'THIS', 'THAT')
find_replace(setpath)
print " "

Why doesn't this work? I get this error:

Traceback (most recent call last):
File "html_find_replace.py", line 12, in ?
find_replace(setpath)
File "html_find_replace.py", line 11, in find_replace
replace = string.replace(str, 'THIS', 'THAT')
File "/usr/local/lib/python2.3/string.py", line 370, in replace
return s.replace(old, new, maxsplit)
TypeError: expected a character buffer object

what's "str" in line 11?

John Roth
 
H

hokiegal99

Thanks for the explanation, I can make it work this way:

import os, string
setpath = raw_input("Enter the path: ")
for root, dirs, files in os.walk(setpath):
fname = files
x = 'THIS'
y = 'THAT'
for fname in files:
myfile = file(os.path.join(root,fname), 'r')
mystr = myfile.read()
myfile.close()
search = string.find(mystr, x)
if search >=1:
string.replace(mystr, x, y)
print "Replacing", x, "with", y, "in", fname

If only I could actually make the change to the files! It works in
theory, but not in practice ;) Anyone recommend how to actual write the
change to the file? I'm new to this, so be kind.

Thanks Everyone!!!
 
J

John Roth

hokiegal99 said:
Thanks for the explanation, I can make it work this way:

import os, string
setpath = raw_input("Enter the path: ")
for root, dirs, files in os.walk(setpath):
fname = files
x = 'THIS'
y = 'THAT'
for fname in files:
myfile = file(os.path.join(root,fname), 'r')
mystr = myfile.read()
myfile.close()
search = string.find(mystr, x)
if search >=1:
string.replace(mystr, x, y)
print "Replacing", x, "with", y, "in", fname

If only I could actually make the change to the files! It works in
theory, but not in practice ;) Anyone recommend how to actual write the
change to the file? I'm new to this, so be kind.

Are you trying to rename the file? Look under os - Files and Directories
for the rename() function. It's 6.1.4 in the 2.2.3 docs.

John Roth
 
H

hokiegal99

John said:
Are you trying to rename the file? Look under os - Files and Directories
for the rename() function. It's 6.1.4 in the 2.2.3 docs.

John Roth

No, I'm trying to find 'this' in files and replace it with 'that'
recursively through a directory. It works, but it doesn't actually
commit the change to the files, it finds 'this' and reports that it
replaced it with 'that', but when I run the scipt again it reports the
same files that it just fixed.
 
J

John Roth

hokiegal99 said:
No, I'm trying to find 'this' in files and replace it with 'that'
recursively through a directory. It works, but it doesn't actually
commit the change to the files, it finds 'this' and reports that it
replaced it with 'that', but when I run the scipt again it reports the
same files that it just fixed.

Oh. You need to open it again for write and write the
changed string back out. The string doesn't have any
persistant connection to the file.

John Roth
 
E

Erik Max Francis

hokiegal99 said:
I hate to answer my own post, but I think I understand what I'm doing
wrong. I'm finding and replacing 'this' with 'that' in the varible
named
mystr, not the actual files. So, how would I go about making the
change
to the actual files instead of a variable that contains their content?

Easy:

inputFile = file(filename, 'r')
data = inputFile.read()
inputFile.close()
data = data.replace(this, that)
outputFile = file(filename, 'w')
outputFile.write(data)
outputFile.close()
 
H

hokiegal99

Easy for you maybe ;)

That works great. I learn something each time I post to the list. With a
community like this, Python will be around forever!!! Thanks for the help.
 
T

Thomas =?ISO-8859-15?Q?G=FCttler?=

hokiegal99 said:
Thanks for the explanation, I can make it work this way:

import os, string
setpath = raw_input("Enter the path: ")
for root, dirs, files in os.walk(setpath):
fname = files
x = 'THIS'
y = 'THAT'
for fname in files:
myfile = file(os.path.join(root,fname), 'r')
mystr = myfile.read()
myfile.close()
search = string.find(mystr, x)
if search >=1:
string.replace(mystr, x, y)
print "Replacing", x, "with", y, "in", fname

If only I could actually make the change to the files! It works in
theory, but not in practice ;) Anyone recommend how to actual write the
change to the file? I'm new to this, so be kind.

I once wrote a replace recursive script. Maybe it helps you:
http://www.thomas-guettler.de/scripts/replace-recursive.py.txt

thomas
 
H

hokiegal99

Thomas said:
I once wrote a replace recursive script. Maybe it helps you:
http://www.thomas-guettler.de/scripts/replace-recursive.py.txt

thomas

Yes that's very helpful, but a bit too complex for me at this point in
time. Here is the script that I put together from all of the responses I
recieved from the list:

#Thanks to comp.lang.python
import os, string
print " "
print "******************************************************"
print " Three Easy Steps to a Recursive find and Replace "
print "******************************************************"
print " "
x = raw_input("1. Enter the string that you'd like to find: ")
print " "
y = raw_input("2. What would you like to replace %s with: " %x)
print " "
setpath = raw_input("3. Enter the path where the prgroam should run: ")
print " "
for root, dirs, files in os.walk(setpath):
fname = files
for fname in files:
inputFile = file(os.path.join(root,fname), 'r')
data = inputFile.read()
inputFile.close()
search = string.find(data, x)
if search >=1:
data = data.replace(x, y)
outputFile = file(os.path.join(root,fname), 'w')
outputFile.write(data)
outputFile.close()
print "Replacing", x, "with", y, "in", fname
print " "
print "**********"
print " Done "
print "**********"
print " "
 

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,756
Messages
2,569,535
Members
45,008
Latest member
obedient dusk

Latest Threads

Top