基本上我想做的只是从一个持有分数的文本文件中覆盖一行,虽然我在搜索了一段时间后没有运气
我很困惑如何将包含旧列表的'val'替换为'empty',并且实质上更新文件'scores.txt'以便替换该行
index = 0
with open('scores.txt','r') as f:
x = f.readlines()
print(x)
name = input('Enter name: ')
print('\n')
c_1 = 0
c_2 = 0
empty = []
for val in x:
c_1 += 1
print("Iteration",c_1)
print('val',val)
if name in val:
print('True: ' + '"' + name + '"' , val)
empty.append(val)
empty = [i.split() for i in empty]
print(empty)
empty = [item for sublist in empty for item in sublist]
print(empty,'\n')
print('len empty',len(empty))
while len(empty) > 4:
del empty[1]
c_2 += 1
print("Del Iteration",c_2)
print('empty after del',empty)
break
elif name not in val:
print("False\n")
index+=1
这可以在'scores.txt'
中看到jill 9 10 7 8 5
bob 4 6 7
denas 2 4
john 1
我的目标是将'jill'的分数降低到只有3,这是我的代码所做的,但是在退出代码并打开'scores.txt'之后保存这个,可以看到变化
我知道这个问题之前已经得到了回答,但是我无法让它为自己工作,因为我还是Python的新手:/
答案 0 :(得分:2)
通常,您需要写入单独的文件,然后将旧文件复制到旧文件上以执行此操作。 (您可以使用wait()
或fileinput看似修改文件,但您可以自己研究这些文件。
作为一个例子,给出:
$ cat /tmp/scores.txt
jill 9 10 7 8 5
bob 4 6 7
denas 2 4
john 1
您可以这样修改文件:
with open('/tmp/scores.txt', 'r') as f, open('/tmp/mod_scores.txt', 'w') as fout:
for line in f:
if line.startswith('jill'):
line=' '.join(line.split()[0:4])
fout.write(line.strip()+"\n")
现在您有一个包含所需修改的文件:
$ cat /tmp/mod_scores.txt
jill 9 10 7
bob 4 6 7
denas 2 4
john 1
现在只需将新文件复制到旧文件的顶部即可完成。要复制,请使用mmap现在让文件scores.txt
看似被修改。
从评论中,要获得最后3分与前3分,你会这样做:
with open('/tmp/scores.txt', 'r') as f, open('/tmp/mod_scores.txt', 'w') as fout:
for line in f:
if line.startswith('jill'):
li=line.split()
line=' '.join([li[0]]+li[-3:])
fout.write(line.strip()+"\n")
答案 1 :(得分:1)
以防万一(dwag的回答是你应该使用的)这里是你的代码在一些修复之后工作:
index = 0
# empty and x must have global scope.
empty = []
x = []
with open('scores.txt','r') as f:
x = f.readlines()
name = input("Enter the name: ")
c_1 = 0
c_2 = 0
for val in x:
c_1 += 1
print("Iteration",c_1)
print('val',val)
if name in val:
empty.append(val)
empty = [i.split() for i in empty]
empty = [item for sublist in empty for item in sublist]
while len(empty) > 4:
del empty[1]
c_2 += 1
break
elif name not in val:
print("False")
index += 1
with open('scores.txt','w') as f:
x[0] = ' '.join(empty + ['\n'])
f.writelines(x)