By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
454,525 Members | 1,634 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 454,525 IT Pros & Developers. It's quick & easy.

Changing a line in a text file

P: n/a
kah
How do I change a line in a file??

For example I have the follwing text in my file:

line1
line2
line3
line4

How do I replace 'line2' with 'newline'. Since the write operation in
python will overwrite everything.

Regards,
Kah

Jul 19 '05 #1
Share this Question
Share on Google+
7 Replies


P: n/a
kah wrote:
How do I change a line in a file??

For example I have the follwing text in my file:

line1
line2
line3
line4

How do I replace 'line2' with 'newline'. Since the write operation in
python will overwrite everything.


This is the best I can figure out what you mean:

lines = []
for line in file("myfile.txt"):
if line == "line2\n":
line = "newline\n"
lines.append(line)

file("myfile.txt", "W").writelines(lines)

--
Michael Hoffman
Jul 19 '05 #2

P: n/a
kah
Hi,

the example provided by Vishnu is quite close to what I want but it
still required me to write all the data back to the file.

Is there any way where I can just write a particular line?

Regards,
Kah

Jul 19 '05 #3

P: n/a
kah wrote:
Hi,

the example provided by Vishnu is quite close to what I want but it
still required me to write all the data back to the file.

Is there any way where I can just write a particular line?

If you are asking whether you can update a file in place, the answer is
"yes" - look up "lseek" in the Python documentation (module os, under
"File Descriptor Operations".

However, you asked about replacing one line with another of a different
length: since this will mean changing the offsets of all subsequent
bytes you have no way to do this other than writing out the whole
content of the file following the modification. You would also have to
ensure that you truncated the file to the correct length.

In general, although they don't make it obvious that they are doing so
most programs that "change" files (text editors and the like) are really
writing new copies.

regards
Steve
--
Steve Holden +1 703 861 4237 +1 800 494 3119
Holden Web LLC http://www.holdenweb.com/
Python Web Programming http://pydish.holdenweb.com/

Jul 19 '05 #4

P: n/a
Hello kah,
How do I change a line in a file??

For example I have the follwing text in my file:

line1
line2
line3
line4

How do I replace 'line2' with 'newline'. Since the write operation in
python will overwrite everything.

See http://docs.python.org/lib/module-fileinput.html (inplace=1 is what you
want).

Bye.
--
------------------------------------------------------------------------
Miki Tebeka <mi*********@zoran.com>
http://tebeka.bizhat.com
The only difference between children and adults is the price of the toys

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (Cygwin)

iD8DBQFCbNAB8jAdENsUuJsRAtc+AJ9cYXBpu4MZ+4NIXFy0Ms dISmpRRwCgthFp
6HB7zB6lq9dpMbz+bZgRtkY=
=dRnr
-----END PGP SIGNATURE-----

Jul 19 '05 #5

P: n/a
You might be able to use "edge" case to make this simple.

1) If the line you are replacing is unique in the file

and

2) File can easily fit in memory

you can write:

fp=open(filename, 'r')
contents=fp.read()
fp.close()
newcontents=newline.join(contents.split(line2))
fp=open(filename, 'w')
fp.write(newcontents)
fp.close()

For small files this is very efficient.

Larry Bates
kah wrote:
How do I change a line in a file??

For example I have the follwing text in my file:

line1
line2
line3
line4

How do I replace 'line2' with 'newline'. Since the write operation in
python will overwrite everything.

Regards,
Kah

Jul 19 '05 #6

P: n/a
Steve Holden <st***@holdenweb.com> writes:
kah wrote:
However, you asked about replacing one line with another of a
different length: since this will mean changing the offsets of all
subsequent bytes you have no way to do this other than writing out the
whole content of the file following the modification. You would also
have to ensure that you truncated the file to the correct length.

In general, although they don't make it obvious that they are doing so
most programs that "change" files (text editors and the like) are
really writing new copies.
In addition, I would argue that editing a file in place using a
non-interactive program is dangerous and bad practice in general. By
the time you find a bug in your edit script, the original is lost. This
is something I learned from bitter experience when I tried to be smart
and make script-based edits over entire directories of html files.

In unix shell scripting idiom, I would do something like:

mv file file.bak
sed -e 'g/oldline/c newline' < file.bak > file

And yes, I know that some versions of sed have the --in-place option.

Then, I would check for side effects:

diff file file.bak

All of this can be done in python, however I'm not overly familiar with
difflib and it seems to require both versions of the file in memory. So
an external diff might be better.

import os
os.rename(foo,foo.bak)
infile = open(foo.bak,'r')
outfile = open(foo,'w')
for line infile:
#test and substitution code block
outfile.write(line)

Using separate input and output files also has the advantage of being
memory efficient.

regards
Steve
--
Steve Holden +1 703 861 4237 +1 800 494 3119
Holden Web LLC http://www.holdenweb.com/
Python Web Programming http://pydish.holdenweb.com/


--
Kirk Job-Sluder
"The square-jawed homunculi of Tommy Hilfinger ads make every day an
existential holocaust." --Scary Go Round
Jul 19 '05 #7

P: n/a
On 4/25/05, Kirk Job Sluder <ki**@jobsluder.net> wrote:
In addition, I would argue that editing a file in place using a
non-interactive program is dangerous and bad practice in general. By
the time you find a bug in your edit script, the original is lost. This
is something I learned from bitter experience when I tried to be smart
and make script-based edits over entire directories of html files.


See http://aspn.activestate.com/ASPN/Coo...n/Recipe/56037

--
Cheers,
Simon B,
si***@brunningonline.net,
http://www.brunningonline.net/simon/blog/
Jul 19 '05 #8

This discussion thread is closed

Replies have been disabled for this discussion.