繁体   English   中英

替换 python 中文件的最后一行

[英]Replace the last line of a file in python

我正在做一个项目,我使用文本文件来存储数据。 我有一个 label 供用户输入名称,我希望将用户名保存在文件的第 41 行,即最后一行。 我尝试了 append 但它只是不断添加最后一行,因此如果用户键入另一个名称,它不会替换它,而是添加另一行。 你能帮我修改一下代码,让它在文本文件的第 41 行中写入名称吗?如果文本文件中已有内容,它只会根据输入替换第 41 行。 直到现在我有这段代码但它不起作用我不知道为什么

def addUser(self):
        global name
        global splitname
        name = self.inputBox.text()
        splitname = name.split()
        print("Splitname {}".format(splitname))
        print(len(splitname))
        self.usernameLbl.setText(name)
        self.inputBox.clear()
        # self.congratulations()
        if name != "":
                if len(splitname) == 2:
                        with open('UpdatedCourseInfo.txt', 'r', encoding='utf-8') as f:
                                data1 = f.readlines()
                        data1[40]= [f'\n{splitname[0]}, {splitname[1]}, 0, None, None']
                        with open('UpdatedCourseInfo.txt', 'w', encoding='utf-8') as f:
                                f.writelines()
                        f.close()
                else:
                        with open('UpdatedCourseInfo.txt', 'r', encoding='utf-8') as f:
                                data1 = f.readlines()
                        data1[40]= [f'\n{splitname[0]}, 0, 0, None, None']
                        with open('UpdatedCourseInfo.txt', 'w', encoding='utf-8') as f:
                                f.writelines()
                        f.close()
        print(name)
        return name

给你go:


# == Ignore this part ==========================================================
# `create_fake_course_info_file`,  `FakeInputBox` and `FakeUsernameLabel` are just
# placeholder classes to simulate the objects that `FakeCls.addUser` method
# interacts with.

def create_fake_course_info_file(filepath: str):
    """Create a fake file to test ``FakeCls`` class implementation.

    Function creates a text file, and populates it with 50 blank lines.

    Parameters
    ----------
    filepath : str
        Path to the file to be created.
    """
    print(f"Saving fake data to: {filepath}")
    with open(filepath, "w") as fh:
        fh.write("\n" * 50)


class FakeInputBox:
    """
    Mock class with necessary methods to run ``FakeCls.addUser`` method.
    """
    def __init__(self, text):
        self._text = text

    def text(self):
        return self._text

    def clear(self):
        self._text = ""


class FakeUsernameLabel:
    """
    Mock class with necessary methods to run ``FakeCls.addUser`` method.
    """
    def setText(self, text):
        self.text = text

# == Actual Code ===============================================================

class FakeCls:

    def __init__(self, name):

        self.inputBox = FakeInputBox(name)
        self.usernameLbl = FakeUsernameLabel()

    def addUser(self):

        global name
        global split_name

        name = self.inputBox.text()
        split_name = name.split()
        print(f"Split Name: {split_name} | Length: {len(split_name)}")
        self.usernameLbl.setText(name)
        self.inputBox.clear()

        # self.congratulations()

        if name != "":
            # Read current contents of the file and save each line of text as
            # an element in a list.
            with open("UpdatedCourseInfo.txt", mode="r", encoding="utf-8") as fh:
                data = fh.readlines()
                # Replace the 41st line with the user's name.
                if len(split_name) == 2:
                    data[40] = f"\n{split_name[0]}, {split_name[1]}, 0, None, None"
                else:
                    data[40] = f"\n{split_name[0]}, 0, 0, None, None"
            # Write the updated list to the file.
            with open("UpdatedCourseInfo.txt", mode="w", encoding="utf-8") as fh:
                fh.writelines(data)
        print(name)
        return name

例子

这是实际的代码:

在此处输入图像描述

笔记

我对您的原始实现进行了一些更改,使其更简洁、更“Pythonic”。 您可以忽略create_fake_course_info_file function、 FakeInputBoxFakeUsernameLabel类中的代码,因为它们只是问题中未提供的实际代码的占位符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM