Reputation: 3307
More details below:
1st line
2nd line
3rd line
4th line
...
Now want to insert a new line named zero line
before 1st line
. File looks like below:
zero line
1st line
2nd line
3rd line
4th line
...
I know sed
command can do this work, but how to do it using python? Thanks
Upvotes: 4
Views: 14124
Reputation: 1519
with open(filename, 'r+') as f:
lines = f.readlines()
lines.insert(0, 'zero line\n')
f.seek(0)
f.writelines(lines)
Upvotes: 1
Reputation: 39307
this might be of interest
http://net4geeks.com/index.php?option=com_content&task=view&id=53&Itemid=11
adapted to your question:
# read the current contents of the file
f = open('filename')
text = f.read()
f.close()
# open the file again for writing
f = open('filename', 'w')
f.write("zero line\n\n")
# write the original contents
f.write(text)
f.close()
Open the file and read the contents into 'text'.
Close the file
Reopen the file with argument 'w' to write
Write text to prepend to the file
Write the original contents of the file to the file
Close file
Read the warnings in the link.
edit:
But note that this isn't entirely safe, if your Python session crashes after opening the file the second time and before closing it again, you will lose data.
Upvotes: 5
Reputation: 414915
Here's an implementation that fixes some deficiencies in other approaches presented sofar:
fileinput
version does notfileinput
version doesIt mimics fileinput
's error handling:
import os
def prepend(filename, data, bufsize=1<<15):
# backup the file
backupname = filename + os.extsep+'bak'
try: os.unlink(backupname) # remove previous backup if it exists
except OSError: pass
os.rename(filename, backupname)
# open input/output files, note: outputfile's permissions lost
with open(backupname) as inputfile, open(filename, 'w') as outputfile:
# prepend
outputfile.write(data)
# copy the rest
buf = inputfile.read(bufsize)
while buf:
outputfile.write(buf)
buf = inputfile.read(bufsize)
# remove backup on success
try: os.unlink(backupname)
except OSError: pass
prepend('file', '0 line\n')
You could use cat
utility if it is available to copy the files. It might be more efficient:
import os
from subprocess import PIPE, Popen
def prepend_cat(filename, data, bufsize=1<<15):
# backup the file
backupname = filename + os.extsep+'bak'
try: os.unlink(backupname)
except OSError: pass
os.rename(filename, backupname)
# $ echo $data | cat - $backupname > $filename
with open(filename, 'w') as outputfile: #note: outputfile's permissions lost
p = Popen(['cat', '-', backupname], stdin=PIPE, stdout=outputfile)
p.communicate(data)
# remove backup on success
if p.poll() == 0:
try: os.unlink(backupname)
except OSError: pass
prepend_cat('file', '0 line\n')
Upvotes: 4
Reputation: 25609
you can use fileinput
>>> import fileinput
>>> for linenum,line in enumerate( fileinput.FileInput("file",inplace=1) ):
... if linenum==0 :
... print "new line"
... print line.rstrip()
... else:
... print line.rstrip()
...
Upvotes: 7
Reputation: 3284
code
L = list()
f = open('text2.txt', 'r')
for line in f.readlines():
L.append(line)
L.insert(0,"Zero\n")
f.close()
fi = open('text2.txt', 'w')
for line in xrange(len(L)):
fi.write(L[line])
fi.close()
text2.txt
Hello
The second line
3
4
5
6
output
Zero
Hello
The second line
3
4
5
6
This can be memory heavy and time consuming for large files however.
If you are worried about something like 31st line, I would just do a mod%10 on the num, to get a more accurate version.
Let me know if this helps, or if you want a better version. Also, if you want a better formatting, look into ljust and rjust for left and right justify.
Upvotes: 0