simultaneous reading and writing a textfile

Larry Bates larry.bates at
Tue May 16 18:19:16 CEST 2006

Marco Herrn wrote:
> Hi,
> I have a text file with some lines in it.
> Now I want to iterate over this file and exchange some lines with some
> others. I tried this approach:
>     try:
>         myfile= file('myfile', 'r+')
>         while 1:
>             line= myfile.readline()
>             if not line: break
>             l= line.strip().split()
>             if len(l) == 1:
>                 hostname= l[0]
>                 myfile.write(hostname+' '+mac+'\n')
>                 break
>     finally:
>         if not myfile is None:
>             myfile.close()
> This should inspect the file and find the first line, that can't be
> split into two parts (that means, which has only one word in it).
> This line should be exchanged with a line that contains some more
> info.
> Unfortunately (or how better python programmers than I am would say,
> "of course") this doesn't work. The line is exchanged, but also some
> more lines.
> Now how can I achieve, what I want? Really exchange one line with
> another, regardless of their length. Is this possible? If this is not
> possible, then what would be the best approach to do this?
> I do not want to read the whole file, exchange the line in memory and
> then write the whole file. This would be quite slow with large files.
> Regard1s
> Marco

The only way that in-place writes will work is if you adopt a fixed
line length for the file and use read(bytes) instead of readline()
method.  You could create file with fixed length lines and write them
in-place without disturbing lines that follow.  Take a look at seek(),
write() methods.

The alternative is to create a different file (read/write
the entire file)each time you want to make a change.  Unless the file
is REALLY long, this will be extremely fast.

If you have a LOT of data you want to work with this way and it is
changing a lot, you need to use a database not a text file for data


More information about the Python-list mailing list