在Python中如何在不使用fileinput模块的情况下从文件中删除一系列行

时间:2016-06-09 11:52:32

标签: python file-io

我正在尝试删除从命令行传递到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()

1 个答案:

答案 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)