2016-01-21 59 views
2

我有一个计算分数'LevelScore'的程序,我想打开UserFile'UserScoreFile'并检查当前保存的用户分数并且如果LevelScore> CurrentScore将表示文本文件中的该级别的前几个字符覆盖到LevelScore。想用Python中的新字符覆盖文本文件中特定行上的特定字符

Text文件中的每一行代表0-7级别,每行格式为“T 000”,T表示级别未锁定,000表示当前分数(分数可以为0-100)“ lev“是一个从0到7的变量,表示用户所在的级别。

UserFileR = open("UserScoreFile.txt","r") 
    UserFileLines = UserFileR.readlines() 
    UserLevelLine = UserFileLines[lev] 
    UserLevelScore = UserLevelLine[2:5] 

if LevelScore > UserLevelScore: 
    UserFileWR = open("UserScoreFile.txt","r+") 
    #This is where i dont know what to do... 
+0

嗨卢克!欢迎来到黑暗的一面...为什么你不在课程中::( –

+0

['fileinput'模块](https://docs.python.org/3/library/fileinput.html)会透明地做到这一点。但你确定你想在每次分数改变时打开,读取,更改和写回整个文件吗?在程序启动时将文件读入列表不是更好,跟踪内存中的变化并写回在退出时列出文件? –

+0

@TimPietzcker我知道卢克在现实生活中,并帮助他完成他的项目,他需要在执行他的程序时多次更改文件内容(他正在制作一个触摸式程序) –

回答

1

这里的解决方案我和卢克想出了协作:

UserFileRW = open("UserScoreFile.txt","r+") 
UserFileLines = UserFileRW.readlines() 
UserLevelLine = UserFileLines[lev] 
UserLevelScore = int(UserLevelLine[2:]) 
UserFileRW.close() 

if LevelScore > UserLevelScore: 
    UserFileWR = open("UserScoreFile.txt","w+") 
    UserFileLines[lev] = "T " + str(LevelScore) + "\n" 
    UserFileRW.writelines(UserFileLines) 
    UserFileRW.close() 

谢谢Jotto和Tim Pietzcker你的贡献。

+0

对你有好处,我忘了用'w +'打开会重启如果存在就移动。除了writelines在列表元素处添加'\ n'。 –

+0

@jotto在经过一些调试之后,我们将其基于您的原始解决方案,谢谢。 –

2

这应该让你开始。

UserFileRW = open("UserScoreFile.txt","r+") 
UserFileLines = UserFileR.readlines() 
UserLevelLine = UserFileLines[lev] 
UserLevelScore = int(UserLevelLine[2:5]) 

if int(LevelScore) > UserLevelScore: 
    UserFileRW.truncate() 
    UserFileLines[lev] = "some tex" + str(LevelScore) # there is something before score, but I don't know what 
    UserFileRW.write(''.join(UserFileLines)) 
    UserFileRW.close() 

不幸的是,这是不可能改变文件中间的东西。所以你必须解析所有这些,进行修改,然后重新写入。

+1

代表Luke Gibson(他坐在我旁边),'UserFileRW.truncate()'不会删除文件的前一个内容,并且在保存的文件的每一行之间还有一个额外的行,任何想法? –

0

使用fileinput module,你可以这样做:

import fileinput 
with fileinput.input(files=["test.txt"], inplace=True) as f: 
    for line in f: 
     if fileinput.lineno() == lev+1:  # line numbers start at 1, not 0 
      UserLevelScore = int(line[2:5]) # assuming LevelScore is an int 
      if LevelScore > UserLevelScore: 
       line = "{}{:0>3}".format(line[:2], LevelScore) 
       # right-justify LevelScore with leading zeroes 
     print(line, end="") # Output is redirected to the current line of the file 
相关问题