【问题标题】:How to save data based on month python如何基于月份python保存数据
【发布时间】:2025-12-23 04:00:17
【问题描述】:

所以基本上我的代码从用户那里获取所有来自篮球、躲避球、球拍网球等的输入,我可以将它们记录到 InvenData.txt 文件中,但是在应用程序关闭后我将如何真正保留它们呢?我使用日期时间,还有一种方法可以用来识别月份吗?这基本上就是我希望它的工作方式......

填写表格(已经完成,接收输入)然后,获取输入并有序地将其放入文件中(也完成了,它也将月份保存在数据中)然后我希望它留在那里.只要他们还在那个当月,它就会更新那个月的数据,当月份发生变化时,抛出,它会将数据下降到与上个月相同的格式,但只是在数据文件的下方

        file.write("Basketballs: " + ballEntry.get() + "\n")
        file.write("Dodgeballs: " + dodgeEntry.get() + "\n")
        file.write("Rackets: " + racketEntry.get() + "\n")
        file.write("Tenisballs: " + TenisballlEntry.get() + "\n")
        file.write("Total: " + totalFile + "\n")
        file.write("Last updated on: " + dateTimeFile + "\n")

当所有用户输入他们的输入时,文件看起来像这样

Basketballs: 423
Dodgeballs: 234
Rackets: 253
Tenisballs: 235
Total: 1145
Last updated on: 2020-01-14

下个月我希望它做什么的示例

Basketballs: 4223
Dodgeballs: 23324
Rackets: 2453
Tenisballs: 2335
Total: 11435
Last updated on: 2020-02-01

感谢阅读!

with open('InvenData.txt', 'r') as f:

    filestring1 = file.write("Current Position: %d" % (fileLinePos) + "\n")
    filestring2 = file.write("Basketballs: " + ballEntry.get() + "\n")
    filestring3 = file.write("Dodgeballs: " + dodgeEntry.get() + "\n")
    filestring4 = file.write("Rackets: " + racketEntry.get() + "\n")
    filestring5 = file.write("Tenisballs: " + TenisballlEntry.get() + "\n")
    filestring6 = file.write("Total: " + totalFile + "\n")
    filestring7 = file.write(timeString)
    file.close()

    list = [filestring1, filestring2, filestring3, filestring4, filestring5, filestring6, filestring7]
    lines = list(f)
    for line in lines:
        file.write(line)

print("Data has been registered successfully!")

messagebox.showinfo('Success!', 'Data added to data centre successfully!')

【问题讨论】:

    标签: python database date tkinter


    【解决方案1】:

    datetime 模块可以识别从年到微秒的时间。

    您可以使用datetime.datetime.strftime(format) 创建一个字符串,它使用标准C 替换来根据给定的datetime 创建一个字符串。

    如果你使用datetime.datetime.now(),你可以使用当前日期:

    import datetime
    
    time = datetime.datetime.now()
    template = 'Last updated on: %Y-%m-%d'
    time_string = time.strftime(template)
    
    print(time_string)
    
    # prints "Last updated on: 2020-01-14"
    

    按照您描述文件格式的方式,最后一行应始终包含最后一个条目的日期,因此您只需将这些行拉到最后一个条目并提取月份即可。要提取,您可以使用datetime.datetime.strptime(input, format) 与相同的格式字符串:

    stripped = datetime.datetime.strptime(time_string, fmt)
    print(stripped)
    print(stripped.month)
    
    # 2020-01-14 00:00:00
    # 1
    

    就处理文件中的数据而言......这听起来像是一个 XY 问题,所以我将首先解决您的问题,然后提出不同的策略。

    如果是同一月份,您要更新数据,如果是新月份,则覆盖数据。您不能简单地将数据插入文件中间:您可以访问读/写指针(即文件中的当前字符),并且可以在该位置进行读取或写入。

    你可以使用这样的算法:

    1. 打开文件进行读写不截断('r+')
    2. 使用 file.tell() 捕获当前光标位置(这将从 0 开始)
    3. 读取行,直到到达日期行。为此,您可以简单地 检查 datetime.datetime.strptime(line, "Last updated on: %Y-%m-%d")。一个 如果不匹配,将引发 ValueError。
    4. 如果有更多行,请使用 file.tell() 再次捕获该位置。
    5. 重复直到没有更多的行可以读取。确保不要更新文件末尾的位置!
    6. 您现在有了文件中上个月条目的开始位置。用新的库存和日期覆盖文件的其余部分。
    7. 可能还有字符,删除它们。
    8. 关闭文件

    请注意,我在最后关闭了文件。作为一般规则,文件应尽快关闭 (Why should I close files in Python?)

    出于同样的原因,也为了简单起见,我建议采用不同的策略。 将整个文件读入一个字符串列表,每行一个字符串:

    with open(filename, 'r') as f:
        lines = list(f)
    

    通过使用“with as”语法,文件将在读取行后关闭。 现在找到最终日期条目的开头(使用与之前算法相同的方法,但在列表中。

    用你的新值修改剩余的行。

    现在以写入模式打开文件。这会截断文件(即删除所有内容!):

    with open(filename, 'w') as f:
      for line in lines:
        f.write(line)
    

    您还可以跟踪行号并执行f.readline(),直到您已阅读除要修改的行之外的所有行,然后从该点开始执行f.write(line)

    基本思想是:不要让文件保持打开的时间过长。在内存中进行修改,然后快速将它们写入文件并再次关闭文件。除非您使用的是一个大文件,否则这应该不是问题,而且对于您的文件格式,我无法想象它会变得非常大。

    顺便说一句,如果您在文件中添加包含字符位置的标题(使用算法中描述的搜索)来跟踪文件中最后一个条目的起始字符,所有这些都可能会被简化

    【讨论】:

    • 谢谢!这有帮助!但是现在我如何将数据永久保存到文件中,然后通过文件调用该数据并进入我的代码?有点像 config.yml,您可以在其中调用代码中的某些数据值。
    • 我已经更新了回复。通常,您不应该直接在文件中工作。使用该文件将信息读入程序的内存并进行处理,然后当它准备好时,用新的清单覆盖该文件。
    • 谢谢,这也很有帮助。但是我如何将其永久保存到数据中。这样即使我重新打开它,它仍然会保留?
    • 当你关闭文件对象时(或with open as块的末尾)写操作完成。在此之前可能有一些数据写入磁盘,但你不能保证它完全写入,直到文件句柄关闭。
    • 收到错误TypeError: 'list' object is not callable 我将代码添加到了原始帖子的底部(我知道它很丑,哈哈)