【问题标题】:How to randomly a select a file with pickle?如何随机选择一个带有泡菜的文件?
【发布时间】:2020-01-07 21:27:47
【问题描述】:

对于一个学校项目,我必须制作一个程序,从文件中随机选择一首歌曲并输入艺术家的姓名和歌曲名称,玩家必须填写艺术家姓名和歌曲名称的空白才能获得积分.

项目的一个要求是它从文件夹中随机选择歌曲的文件,所以我尝试使用pickle 模块和turtle 模块 - 用于选项卡和输出程序的地方如果这是有道理的,我用词正确。

不幸的是,似乎没有很多东西。我最大的是因为我在代码中得到了歌曲,当它运行时它在选项卡中与它们重叠,我希望程序一次只显示一首歌曲并隐藏其余歌曲,直到用户猜到

这是我的代码:

import turtle
import os
import pickle
import random

#Screem
screen = turtle.Screen()
screen.bgcolor("black")
screen.title("Main Screen")

#Border
border = turtle.Turtle()
border.speed(0)
border.penup()
border.color("white")
border.setposition(-300, -300)
border.pensize(3)
border.pendown()
for side in range(4):
    border.fd(600)
    border.lt(90)
border.hideturtle()

song1 = turtle.Turtle()
song1.color("white")
song1.penup()
song1.speed(0)
song1.setposition(-200, -200)
song1string = ("_ost malone _n god")
song1.write(song1string, False, align="Left", font=("Arial", "14", "normal"))
song1string2 = ("_minem _ap _od")
song1.write(song1string2, False, align="Left", font=("Arial", "14", "normal"))
song1.hideturtle()

song1.clear()

songs = []
songs.append(song1string)
songs.append(song1string2)
pickle.dump(songs, open("songs.py", "wb"))

songs = pickle.load(open("songs.py", "rb"))

final_song = random.choice("songs.py")

screen.mainloop()

【问题讨论】:

  • 我不确定,但是您是否尝试过使用random 模块,然后使用random.choice() 方法?
  • 是的,我有,但它仍然超过了几圈,如果我 .clear 早些时候在代码中它一直保持清除状态。
  • 为什么标题和正文的一部分与最后概述的问题完全不同?另外,我强烈建议使用上下文管理器来处理文件对象。
  • 我不明白你的意思对不起

标签: python pickle turtle-graphics python-3.8


【解决方案1】:

坦率地说,我不明白你的代码在做什么,也不明白你为什么要使用pickle。无论如何,# ALL CAP cmets 的以下更改可能会有所帮助:

import turtle
import os
import pickle
import random

#Screem
screen = turtle.Screen()
screen.bgcolor("black")
screen.title("Main Screen")

#Border
border = turtle.Turtle()
border.speed(0)
border.penup()
border.color("white")
border.setposition(-300, -300)
border.pensize(3)
border.pendown()
for side in range(4):
    border.fd(600)
    border.lt(90)
border.hideturtle()

song1 = turtle.Turtle()
song1.color("white")
song1.penup()
song1.speed(0)
song1.setposition(-200, -200)
song1string = ("_ost malone _n god")
song1.write(song1string, False, align="Left", font=("Arial", "14", "normal"))
song1.setposition(-200, -180)  # ADDED SO NEXT ONE IS ON DIFFERENT LINE
song1string2 = ("_minem _ap _od")
song1.write(song1string2, False, align="Left", font=("Arial", "14", "normal"))
song1.hideturtle()

#song1.clear()   # DISABLED

songs = []
songs.append(song1string)
songs.append(song1string2)
pickle.dump(songs, open("songs.pkl", "wb"))  # Changed file name.

songs = pickle.load(open("songs.pkl", "rb"))  # Changed file name.

final_song = random.choice(songs)  # CHANGED TO SELECT ONE FROM UNPICKLED LIST.
print('final_song: {!r}'.format(final_song))  # ADDED

screen.mainloop()

【讨论】:

  • 我正在使用 pickle,因为我需要从外部文件保存并打开它。这是我需要为该项目做的:pastebin.com/jYPW1QXA
  • 好的。我的答案中的更改显示了如何将 dump 歌曲列表输出到 pickle 文件并从其中返回 load (即使后者不是必需的)。
  • 非常感谢。不过我还有一个问题:如果我有多首歌曲并且它随机选择一首歌曲,它是否仍会显示其他歌曲并将它们重叠在海龟窗口中?最后的打印部分是否打印到终端或实际的海龟窗口中?
  • 我只希望它一次显示一首歌曲,然后从文件中随机选择另一首并将其放在海龟窗口而不是终端中
  • songs 列表的显示完全独立于将它们转储到 pickle 文件。要显示它们,您需要在遍历列表时分别定位和编写每一个。您可以在需要时随时从列表中随机选择一首歌曲。要从 pickle 文件中选择一首歌曲,您需要预先将它包含的列表加载到一个变量中——有点像我的答案中的代码。除了先从文件中加载数据,pickle 与选择歌曲无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 2015-05-18
  • 2020-10-15
  • 1970-01-01
相关资源
最近更新 更多