我目前正在制作一个学校作业的脚本,它将具有许多功能,但我坚持使用的是删除功能。 基本上,它需要做的是从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行罚款,但上面的任何数字都会删除下面的所有数字。 我知道这种移除应该发生,但我找不到这样做的方法,所以只删除了一行。
由于 康涅狄格州
答案 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])