【问题标题】:Is there any way to use generator and open a file?有没有办法使用生成器并打开文件?
【发布时间】:2020-08-13 22:37:48
【问题描述】:

我目前正在开发一个 discord.py 机器人,希望在我的代码中更频繁地使用生成器。 但是当我尝试使用输出生成器初始化对象方法时出现错误。 这是我尝试做的:

def get_language_config(member: Member):
    [role] = [role.name for role in member.roles if role.name in LANGS]
    return LANGS_TO_CONFIG[role]


@client.command(name="ip")
async def ip_command(ctx):
    sender = ctx.author
    translation = get_language_config(sender)
    data = Data(translation).read("langs")["IP_COMMAND"] # Here is the line that seems raise a problem.
    embed = BaseEmbed(title=data["title"], description=data["description"])
    embed.add_field(name=data["field_1"][0], value=data["field_1"][1])
    await ctx.send(embed=embed, file=BaseEmbed.BASIC_FILE)

这是 Data() 对象类:

import json


class Data:
    def __init__(self, data):
        self.data = data

    def update(self, key, value):
        with open("data/config.json", "r", encoding="utf-8") as file:
            json_data = json.load(file)
            json_data[self.data][key] = value
        with open("data/config.json", "w") as file:
            json.dump(json_data, file, indent=2)

    def read(self, file: str):
        with open("data/%s.json" % file, "r+", encoding="utf-8") as json_file:
            data = json.load(json_file)
        return data[self.data]

输出错误:

ValueError: I/O operation on closed file

P.S.:对不起我的语言(我是法语),这是我第一次在网站上发布任何内容。

【问题讨论】:

  • 我可以肯定的是他的错误来自生成器元素返回:因为如果我这样做print(Data("EN").read("langs")["IP_COMMAND"]) 就可以了

标签: python json file discord.py valueerror


【解决方案1】:

您正在尝试读取已关闭的文件, 尝试打开它:

with open("YOUR_FILE", "r") as file:
    data = Data(translation).read("file")["IP_COMMAND"]

【讨论】:

  • 你好,是的,但我已经在我的代码的其他部分使用了这个方法 (read()),而且这个方法非常有效
  • 可能是return语句的原因?
  • 这就是问题所在,您在其他任何地方都使用它,但在这里:data = Data(translation).read("langs")["IP_COMMAND"] 这就是问题所在,如果未打开文件,使用 open() 执行操作后,您的行会自动关闭文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2019-01-30
  • 1970-01-01
  • 2022-01-05
  • 2020-05-10
  • 2018-07-23
  • 2019-10-15
相关资源
最近更新 更多