以下更多详情:
1st line
2nd line
3rd line
4th line
...
现在想要在zero line
之前插入一个名为1st line
的新行。文件如下所示:
zero line
1st line
2nd line
3rd line
4th line
...
我知道sed
命令可以完成这项工作,但如何使用python做到这一点?感谢
答案 0 :(得分:6)
您可以使用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()
...
答案 1 :(得分:4)
这可能是有意义的
http://net4geeks.com/index.php?option=com_content&task=view&id=53&Itemid=11
适应了您的问题:
# 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()
打开文件并阅读 内容为'文本'。
关闭文件
使用参数'w'重新打开文件 写
将文字写入文件前面
写出原始内容 文件到文件
关闭文件
阅读链接中的警告。
编辑:
但请注意,这并非完全如此 安全,如果您的Python会话崩溃 第二次打开文件后 再次关闭之前,你会的 丢失数据。
答案 2 :(得分:3)
这是一个实现,修复了其他方法中的一些缺陷:
fileinput
version不支持fileinput
version 它模仿fileinput
的错误处理:
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')
如果可以复制文件,则可以使用cat
实用程序。它可能更有效:
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')
答案 3 :(得分:0)
<强>码强>
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
<强>输出强>
Zero
Hello
The second line
3
4
5
6
然而,对于大文件来说,这可能会耗费大量内存并且非常耗时。
如果你担心第31行这样的话,我会在num上做一个mod%10,以获得更准确的版本。
如果这有帮助,或者您想要更好的版本,请告诉我。另外,如果你想要更好的格式化,请查看左右对齐的ljust和rjust。
答案 4 :(得分:0)
with open(filename, 'r+') as f:
lines = f.readlines()
lines.insert(0, 'zero line\n')
f.seek(0)
f.writelines(lines)