【问题标题】:How to make it so my code remembers what is has written in a text file?如何使我的代码记住文本文件中写入的内容?
【发布时间】:2022-08-14 20:31:35
【问题描述】:

你好 python 新手在这里。 我有将名称打印到文本文件中的代码。它从网站上获取名称。在那个网站上,可能有多个相同的名字。通过查看名称是否已写入文本文件,它可以将它们完美地过滤成一个名称。但是当我再次运行代码时,它会忽略文本文件中已经存在的名称。它只是过滤它在同一会话中写入的名称。所以我的问题是如何让它记住它所写的内容。

文本文件的图像

kaupan_nimi = driver.find_element_by_xpath(\"//span[@class=\'store_name\']\").text
with open(\"mainostetut_yritykset.txt\", \"r+\") as tiedosto:
                if kaupan_nimi in tiedosto:
                    print(\"\\033[33mNimi oli jo tiedostossa\\033[0m\")
                else:
                    print(\"\\033[32mUusi asiakas vahvistettu!\\033[0m\")
                    #Kirjoittaa tekstitiedostoon yrityksen nimen
                    tiedosto.seek(0)
                    data = tiedosto.read(100)
                    if len(data) > 0:
                        tiedosto.write(\"\\n\")
                    tiedosto.write(kaupan_nimi)

有我认为是问题的代码。如果我错了,请纠正我。

    标签: python-3.x selenium


    【解决方案1】:

    您当前的代码有两个主要问题。

    第一个是,如果重复名称是背靠背的,您可能只能检测到重复的名称。也就是说,如果您再次看到的先前名称是写入文件的最后一件事。那是因为文件中的所有行除了最后一个将在它们的末尾有换行符,但你的名字没有换行符。您目前正在寻找与名称完全匹配的行,因此您只能在最后一行看到它,因为它还没有换行符。如果您正在处理的名称列表已排序,则重复项自然会聚集在一起,但如果您稍后添加一些其他名称列表,它可能不会准确地从最后一个列表离开的位置开始。

    您的代码中的第二个问题是,一旦开始填充一点,它将倾向于破坏任何写入文件中超过 100 个字符的内容,从该点开始每一新行。

    让我们看看代码的不同部分:

    if kaupan_nimi in tiedosto:
    

    这是您的重复检查,它将文件视为迭代器并读取每一行,检查 kaupan_nimi 是否与其中任何一个完全匹配。对于文件中的大多数行,这将始终失败,因为它们将以 "\n" 结尾,而 kaupan_nimi 不会。

    我建议改为每批名称只读取一次文件,并在程序的内存中保留set 的名称,您可以检查要添加的名称。这将更有效率,并且不需要从磁盘重复读取,或者遇到换行问题。

    tiedosto.seek(0)
    data = tiedosto.read(100)
    if len(data) > 0:
        tiedosto.write("\n")
    

    此代码似乎正在检查文件是否为空。但是,它总是将文件位置保留在字符 100 之后(如果到目前为止,文件中的字符少于 100 个,则在文件末尾)。您可能可以在前 100 个字符中放置多个名称,但在那之后,您总是会得到从索引 100 开始并从那里继续的名称。这意味着你会得到一个写在彼此之上的名字。

    如果您接受我之前的建议并保留一组已知名称,您可以检查该组以查看它是否为空。这不需要对文件执行任何操作,因此您在其上操作的位置可以一直保留在最后。另一种选择是总是用换行符结束文件中的每一行,这样您就不必担心是否仅在文件不为空时才添加换行符,因为您知道在文件末尾您将始终编写一个新鲜线。只需在每个名称后面加上一个换行符,您就会一直在做正确的事情。

    以下是我将事情放在一起的方式:

    # if possible, do this only once, at the start of the website reading procedure:
    with open("mainostetut_yritykset.txt", "r+") as tiedosto:
        known_names = set(name.strip() for name in tiedosto) # names already in the file
    
        # do the next parts in some kind of loop over the names you want to add
        for name in something():
    
            if name in known_names:            # duplicate found
                print("\033[33mNimi oli jo tiedostossa\033[0m")
    
            else:                              # not a duplicate
                print("\033[32mUusi asiakas vahvistettu!\033[0m")
    
                tiedosto.write(kaupan_nimi)    # write out the name
                tiedosto.write("\n")           # and always add a newline afterwards
                # alternatively, if you can't have a trailing newline at the end, use:
                # if known_names:
                #     tiedosto.write("\n")
                # tiedosto.write(kaupan_nimi)
    
                known_names.add(kaupan_nimi)   # update the set of names
    

    【讨论】:

      猜你喜欢
      • 2021-02-16
      • 2020-06-30
      • 2011-03-05
      • 2014-04-07
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多