【问题标题】:CSV file content is being loaded with "quotes"CSV 文件内容正在加载“引号”
【发布时间】:2021-02-15 13:41:40
【问题描述】:

我需要帮助才能从 csv 文件写入和恢复数据。

我的参数game 是一个包含 2 个元素的元组。这是一个例子:

(((4, 0), (4, 1), (4, 2), (4, 3)), [[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]])

我需要两个功能,一个是保存游戏,另一个是恢复游戏。这就是我目前所拥有的:

保存游戏:

def save_game(game):
    with open ('file.csv', 'w') as f:
        csv_file = csv.writer(f)
        csv_file.writerow(game)

恢复游戏:

def recover_game():
    with open ('file.csv', 'r') as f:
        csv_file = csv.reader(f)
        for line in csv_file:
            game = line[0], line[1]
            return game

但是,在恢复游戏时,我得到了这样的结果:

('((4, 0), (4, 1), (4, 2), (4, 3))', '[[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]]')

有什么办法可以去掉引号,这样我就可以得到一个类似的元组,就像传递给我的 game 参数的元组一样?

谢谢。

【问题讨论】:

  • 模块csv在编写之前将所有非字符串(例如元组)转换为字符串表示形式。但是你想存储元组,而不是字符串表示。因此,CSV 不是持久化数据的最佳选择。看看pickle 模块。
  • 您希望您的数据是什么样的CSV 文件?它看起来与您的原始元组不完全一样,但如果您希望每个元组与文件中的一行相对应(例如),这是可行的。
  • 只有一行是没有意义的。每个元组一行是更好的选择。
  • 但是如果我想用 CSV 模块来做,可以吗?

标签: python csv file


【解决方案1】:

正如@BoarGules 指出的那样,在这种情况下您可能应该使用pickle。你可以这样做:

import pickle


def save_game(game, out_pathname="./game.pkl"):
    with open(out_pathname, "wb") as out_file:
        pickle.dump(game, out_file, pickle.HIGHEST_PROTOCOL)


def recover_game(in_pathname="./game.pkl"):
    with open(in_pathname, "rb") as in_file:
        return pickle.load(in_file)

此方法的优点之一是它适用于任何可腌制对象,因此即使您后来决定更改 game 对象的内部细节,上面的两个函数仍然可以工作。

【讨论】:

    猜你喜欢
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 2022-01-27
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多