我正在尝试删除从命令行传递到Python脚本的一系列行。这意味着,我将传递输入文件名,起始行号(从哪里开始删除)和要从输入文件中删除的行数。我试过使用fileinput模块,这是有效的。 从我的unix提示符运行的命令是:
python script.py inputfile 2 6
以下是代码:
#!/usr/bin/python
import fileinput
import sys
filename, start, upto = sys.argv[1:4]
start, upto = int(start), int(upto)
for line in fileinput.input(filename, inplace=1, backup='.orig'):
if start <= fileinput.lineno() < start + upto:
pass
else:
print line[:-1]
fileinput.close()
但是,我的要求是在不使用fileinput的情况下执行相同的操作。我已经能够在某种程度上尝试,下面是我尝试过的代码。输出应与前一代码完全相同。保留备份文件可以忽略不计。如果有人能帮助我达到要求,那将会有很大的帮助。感谢。
#!/usr/bin/python
#import fileinput
import sys
filename, start, upto = sys.argv[1:4]
start, upto = int(start), int(upto)
f = open(filename, "r+")
for lineno, line in enumerate(f):
if start <= lineno < start + upto:
length = len(line)
f.seek(-length, 1)
f.write("")
f.close()
答案 0 :(得分:0)
使用第二个文件
with open(fileinput) as fin, with open(fileoutput) as fout:
for i,l in fin:
if start <= i < start + upto:
fout.write("%s\n"%l)
<强>在存储器强>
如果您坚持不使用第二个文件,那么如何将整个文件加载到内存中,例如:
import sys
filename, start, upto = sys.argv[1:4]
start, upto = int(start), int(upto)
fread = open(filename)
original = list(fread)
fread.close()
fileinput = open(filename, "w")
for line in original:
if start <= fileinput.lineno() < start + upto:
pass
else:
fileinput.write("%s\n" % line)
fileinput.close()
您可能需要考虑使用文件i / o的上下文管理器。同样替换为行列表,您只需切入该列表:
import sys
filename, start, upto = sys.argv[1:4]
start, upto = int(start), int(upto)
with open(filename) as fread:
original = list(fread)
with open(filename, "w") as fileinput:
for line in original[start:start+upto]:
fileinput.write("%s\n" % line)