Python购物清单文本应用,保存问题

Posted

技术标签:

【中文标题】Python购物清单文本应用,保存问题【英文标题】:Python shopping list text application, saving issues 【发布时间】:2017-01-06 22:23:41 【问题描述】:

我正在尝试学习 python,作为一个项目,我开始制作购物清单文本脚本。该脚本应该询问您是否要在列表中添加/删除项目。它还具有打印列表的功能。您可以将列表保存为 .txt 文档,并在需要时继续。

我的第一个问题是,当我保存列表项并将它们带回时,所有不同的列表项都变成了一个列表项。所以我可以添加,但我无法从列表中删除单个项目。

我现在尝试从 .txt 文档中拆分列表。我认为这会拆分列表,但现在每次我启动脚本时都会添加额外的符号保存它,然后再次启动它。我可以做一些小的调整还是我的想法遥不可及?

#I think the main problem is in the program_start_list_update_from_file defenition

# Shopping list simulator
shoppingList = []

def program_start_list_update_from_file():
    global shoppingList
    outputname = "shoppinglistfile.txt"
    myfile = open(outputname, 'r')
    lines = str(myfile.read().split(', '))
    shoppingList = [lines]
    myfile.close()

def shopping_list_sim():
    print("Would you like to add (a) delete (d) or list (l) items in your shopping list?")
    print('Press (e) for exit and (s) for list saving')
    playerInput = input()
    outputname = "shoppinglistfile.txt"


    try:
        if playerInput == "a":
            print("What item would you like to add?")
            shoppingList.append(input())
            print("Item added")
            shopping_list_sim()


        elif playerInput == "d":
            print("What item would you like to remove?")
            print(shoppingList)
            shoppingList.remove(input())
            print("Item removed")
            shopping_list_sim()

        elif playerInput == "l":
            myfile = open(outputname, 'r')
            yourResult = ', '.join(myfile)
            print(yourResult)
            shopping_list_sim()


        elif playerInput == "e":
            print("Exiting program")
            sys.exit()

        elif playerInput == "s":
            myfile = open(outputname, 'w')
            myfile.write(', '.join(shoppingList))
            myfile.close()
            shopping_list_sim()
        else:
            print("Please use the valid key")
            shopping_list_sim()
    except ValueError:
        print("Please put in a valid list item")
        shopping_list_sim()

program_start_list_update_from_file()
shopping_list_sim()

【问题讨论】:

你能提供一些示例输出和保存列表的示例吗? 是的,添加了钥匙、香蕉和胡萝卜。第一次保存后的 .txt 文件是 ['']、key、banana、carrot。第二次打开程序并添加鼠标,然后保存。结果:["['']", 'key', 'banana', 'carrot'], 鼠标。第三次添加单词实例并保存。结果:['["[\'\']"', "'key'", "'banana'", "'carrot']", 'mouse'], 实例。 @TemporalWolf 【参考方案1】:

问题的根源是

lines = str(myfile.read().split(', '))
shoppingList = [lines]

您将文件拆分为一个列表,从该列表中创建一个字符串,然后将该单个字符串添加到一个列表中。

shoppingList = myfile.read().split(', ')

足以做你想做的事:split 为你创建一个列表。


您应该考虑从递归调用切换到循环: 每个递归调用都会增加开销,因为它会构建一个新的stack frame,在这种情况下这是完全没有必要的。

按照你目前的方式,每个新提示都有一个新的堆栈框架:

shopping_list_sim()
    shopping_list_sim()
        shopping_list_sim()
            shopping_list_sim()
                ...

如果您在循环中执行此操作,则不会递归地构建堆栈。

【讨论】:

这解决了!现在唯一的问题是它输出文本的方式,如果我列出它以 、keyless、banana 开头的项目。因此,当我想删除列表看起来像 [''、'keyless'、'banana'] 的项目时,它也会添加一个额外的符号。你知道怎么解决吗? 使用您提供的代码,我看不到 repl.it 我认为这与 repl 没有将其保存到 .txt 文件有关。另外,在将项目删除为“预览”列表时打印 ['', 'keyless', 'banana'] 的原因是因为我正在打印列表。通过执行print(', '.join(shoppingList)) 解决了这个问题。问题仍然是它在所有列表的开头添加了“,”。 即使我通过命令行运行您的代码也不会表现出这种行为:python3 shop.py。我添加了错误处理,但除了上面列出的之外没有更改列表逻辑。 额外的“,”可能来自elif playerInput == "s": myfile = open(outputname, 'w') myfile.write(' ,'.join(shoppingList)) myfile.close() shopping_list_sim()

以上是关于Python购物清单文本应用,保存问题的主要内容,如果未能解决你的问题,请参考以下文章

python3 购物车小程序,余额写入文件保存

Python学习手册之控制结构

第一个 Python/Kivy/KivyMD 应用程序。无法将文本字段中的数据保存到变量 + 数据绑定到 MDList

如何保存执行过程中更改的列表?

python超市购物清单

python-购物车