替换文本文件中的一行

时间:2016-02-09 18:56:48

标签: python list file replace line

基本上我想做的只是从一个持有分数的文本文件中覆盖一行,虽然我在搜索了一段时间后没有运气

我很困惑如何将包含旧列表的'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的新手:/

2 个答案:

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