【问题标题】:Importing data to a text file将数据导入文本文件
【发布时间】:2015-11-30 09:21:20
【问题描述】:

我的程序是数学测验。用户完成 10 个问题,然后获得分数。然后需要将该分数附加到文本文件中。

if classs == "1":
    text_file = open("Class1.txt", "r")
    data = text_file.read()
    text_file.close()
    if name in data:
        searchName(name, score)
    else:
        text_file = open("newFileName.txt","a")
        text_file.write(str(name) +","+ str(score)+ "\n")
        text_file.close()

    questions = 0
    score = 0
    break

此代码块将用户得分和名称附加到文本文件中。

但是我需要这样做,如果用户已经参加了测验,分数会附加到该名称而不是创建一个新值。分数应该被追加,直到一个名字有三个分数,然后如果再次参加测验,它将删除第一个分数并附加最新的分数。

def searchName(name, score):
    with open("Class1.txt", 'r') as f:
        data = f.read().split('\n')
        print(data)
        with open("newFileName.txt", 'w') as newFile:
            for line in data:
                if name in line:        
                    line+=(',') + str(score) + (',')
                newFile.write(line + '\n')

但它只保存 1 分,并在再次参加测验后将其删除。

Dion,0
Jarrod,1
Jake Bing,6
Charlie,2,5

恢复到

Dion,0
Jarrod,1
Jake Bing,6,5
Charlie,2,

如果其他用户使用测验 (Jake Bing)

【问题讨论】:

  • 您不能追加到文件中间的行。您需要保存该行,将其删除,附加新数据,然后将其写回

标签: python


【解决方案1】:
def main():

data_file = open("C:\Users\sama0714\Test\\test.txt");

data = dict()
new_score = ("Jake Bing", 4)

for line in data_file.readlines():
    record = line.split(':')
    data[record[0]] = list(record[1].split(','))

try:
    data[new_score[0]].append(new_score[1])
except KeyError:
    data[new_score[0]] = list(str(new_score[1]))

data_file.close()

data_file =  open("C:\Users\sama0714\Test\\test.txt","w");
for name, scores in data.items():
    data_file.write(name + ":" + ",".join(str(i) for i in scores))

data_file.close()

如评论中所述,读取整个文件并更改数据并将其写回。

我在这里使用字典来访问特定玩家的信息以快速访问数据,使用可以使用任何数据处理程序list或'set`等。

我已将文件中的数据结构更改为如下所示,以便轻松创建字典。 (: 将姓名与分数分开)

查理:2,5

迪翁:0

贾罗德:

杰克·宾:4

我已尝试消除 KeyError 失败,以防万一这是第一次尝试

【讨论】:

    【解决方案2】:

    处理此问题的最简单方法可能是为每个类创建一个字典(尽管如果类中存在重复名称,这将很容易出现问题)。对于每个名称(字典键),您可以创建一个列表并将分数附加到列表中。处理完输入后,您可以一次写出所有分数。这也比重复读取和写入文件更有效。它可能看起来像这样(在您的 if classs... 声明之后创建 student_dict):

    def search_name(name, score, student_dict):
    
        if name not in student_dict.keys():
            student_dict[name]=[]
        student_dict[name].append(score)
    
        return student_dict #{"student_name":[score_1,score2], ... }
    

    完成分数处理后,您可以一步将分数名称和列表直接写入文件。理想情况下,我会完全取消search_name,只需一步将所有名称和分数直接导入字典,然后在第二步将字典写入文件。有关如何编写字典的更多信息,请查看this。要了解如何将列表转换为字符串,请查看 this page。如果您还有其他问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 2019-09-01
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多