Pickle (Python 3.6) 写入空文件

Posted

技术标签:

【中文标题】Pickle (Python 3.6) 写入空文件【英文标题】:Pickle (Python 3.6) Writes Empty File 【发布时间】:2018-05-18 12:37:04 【问题描述】:

我正在尝试自学 Python,因此创建了一个愚蠢的脚本来检查博客网站以检查新更新,然后保存与更新相关的元数据。如果有新帖子,我打开以前的元数据,附加新元数据,然后保存。但是,我发现很多时候(无法弄清楚它何时起作用和不起作用),这些更新会产生一个空文件,并且我会丢失所有元数据。

if new_post_count > 0:
        file_name = 'all_posts' + user

        previous_posts = pickle.load(open(file_name, 'rb'))

        current_posts = get_posts(client, user, start_from_posts=0, total_posts=new_post_count)

        all_posts = previous_posts.extend(current_posts)

        f = open(file_name, 'wb')
        pickle.dump(all_posts, f)
        f.close() 

看看论坛,除了 pickle 之外,使用其他东西来保存我的数据可能更有意义(有什么建议吗?)。即使是这样,我仍然想知道我在这里做错了什么,所以我以后不会犯同样的错误。

【问题讨论】:

不要将open(file_name, 'rb') 传递给pickle.load。使用上下文管理器确保退出时文件已关闭。 如果你的数据是纯 python dict/lists...你最好用json 说。 【参考方案1】:

问题不在于 pickle 模块,而在于以下代码行:

 all_posts = previous_posts.extend(current_posts)

实际发生的是调用 extend 方法,扩展 previous_posts,一旦成功完成,返回关键字 None

然后您将这个关键字分配给 all_posts 而不是 previous_posts 的内容,然后将其写入文件。

尝试如下修改:

if new_post_count > 0:
    file_name = 'all_posts' + user

    previous_posts = pickle.load(open(file_name, 'rb'))

    current_posts = get_posts(client, user, start_from_posts=0, total_posts=new_post_count)

    previous_posts.extend(current_posts)

    f = open(file_name, 'wb')
    pickle.dump(previous_posts, f)
    f.close() 

最好是加入 Jean-Francois 的建议:

if new_post_count > 0:
    file_name = 'all_posts' + user
    with open(file_name, 'rb') as f:
        previous_posts = pickle.load(f)

    current_posts = get_posts(client, user, start_from_posts=0, total_posts=new_post_count)

    previous_posts.extend(current_posts)

    with open(file_name, 'wb') as f:
        pickle.dump(previous_posts, f) 

【讨论】:

有趣。关于这些问题何时发生,是否有一个普遍的理念?我从没想过扩展运算符会返回“无”。没有添加一条 all_posts = previous_posts 的行,有没有办法通过简单地将两者结合起来创建一个新列表? 'with' 风格是什么意思? @user71216 在这种情况下你可以做all_posts = previous_posts + current_posts @user71216 请注意,上述方法仅在两者都是列表时才有效。如果current_posts 是一个集合,则需要使用extend() 方法,该方法适用于任何可迭代对象 已对其进行了修改,接受了建议的编辑并删除了关于 with 样式的评论,因为它现在被合并了。 @user71216 现在,它会在每个标识的部分完成后自动关闭打开的文件(这是前面提到的 with 样式,现在已被删除)。

以上是关于Pickle (Python 3.6) 写入空文件的主要内容,如果未能解决你的问题,请参考以下文章

无法在 python 3.6 中安装 pickle

Python pickle序列化后写入文件,并实现曾加内容

python 基础

保存数据到文件的模块(configparser,json,pickle,shelve,xml)_python

Python文件

使用 python 3.6 将多个文件并行加载到内存中的最佳方法是啥?