从文本文档中删除一行

时间:2016-03-25 19:07:48

标签: python python-3.x

我目前正在制作一个学校作业的脚本,它将具有许多功能,但我坚持使用的是删除功能。 基本上,它需要做的是从10行中删除用户所需的行(我们只能写10行。 例如,如果文档有:

1
2
3
4
5
6
7
8
9
10

我尝试删除8,它会像这样重写:

1
2
3
4
5
6
7
9
10

我目前的代码在这里。

    elif action1 == '2':
    linetoremove = input('What line would you like to remove? (1 up to 10)')
    with open('highscore.txt', 'r') as fin:
        data = fin.read().splitlines(True)
    with open('highscore.txt', 'w') as fout:
        fout.writelines(data[int(linetoremove)]:)

删除第1行罚款,但上面的任何数字都会删除下面的所有数字。 我知道这种移除应该发生,但我找不到这样做的方法,所以只删除了一行。

由于 康涅狄格州

5 个答案:

答案 0 :(得分:2)

python中的数组(列表和元组)以索引0开始,而不是1.这就是为什么当用户输入" 1"时,您的代码似乎成功删除第一行。在编写时,您的代码仅打印由linetoremove索引的行。

linetoremove = input('What line would you like to remove? (1 up to 10)')
with open('highscore.txt', 'r') as fin:
    data = fin.read().splitlines(True)
del data[int(linetoremove)-1]
with open('highscore.txt', 'w') as fout:
    fout.writelines(data)

您还可以验证输入的值。

答案 1 :(得分:0)

使用enumerate迭代每行文本并获取其在文件中的位置:

with open('highscore.txt', 'w') as fout:
    for line_number, line in enumerate(data):
        if line_number != int(linetoremove):
            fout.write(line)

答案 2 :(得分:0)

不应该在这里要求回答家庭作业,但我感觉很亲切!不是最有效或最快的,但我认为它会向你展示最好的步骤!

def removeLine(line, file):
    f1 = open(file, 'rb').readlines() #Creates a list of the lines in the file, automatically closes file
    try:
        del f1[line-1] #Attempt to delete the line at index
    except:
        print 'Line %s does not exist in %s'%(line, file) #Print and return if it cannot
        return
    f2 = open(file, 'wb') #open new instance of the file in write mode
    for i in f1:
        f2.write(i) #write to the file
    f2.close() #Close file

removeLine(5, 'data')

答案 3 :(得分:0)

要了解您的代码无效的原因,您可能需要阅读list slicing in Python

假设用户输入了' 4'作为要删除的行号,这会导致将以下切片发送到您的writelines

data[4:]

我们可以通过以下示例看到它的作用。

data = [0, 1, 2, 3, 4, 5, 6, 7, 8]
data[4:] # [4, 5, 6, 7, 8]

简而言之,它返回data中索引大于或等于4的所有值的列表。(请注意,第一个元素的索引为0。)

这可以与补充切片组合以执行类似移除的操作。

data = [0, 1, 2, 3, 4, 5, 6, 7, 8]
data[:3] + data[4:] # [0, 1, 2, 4, 5, 6, 7, 8]

请注意,我将其称为类似删除操作,因为它创建了一个新列表而不是编辑现有列表。要修复代码,您可以执行以下操作:

index = int(linetoremove) - 1
fout.writelines(data[:index] + data[index+1:])

答案 4 :(得分:-1)

del_line = input('What line would you like to remove (1 up to 10)? ')
lines = open('highscore.txt').readlines()
open('highscore.txt', 'w').writelines(lines[del_line:-1])